{"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 and for their Customers. 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."},{"name":"Customers","x-audience":"public","x-slo-tier":{"tier":"beta"},"description":"The Customers APIs enable developers to create and manage their end-user customers. Customers can be individuals or businesses and have various capabilities like sending/receiving fiat and crypto, trading, etc. Customer information includes KYC/compliance data, verification requirements, and capability management."},{"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.\n\n## Crypto Deposit Destinations\n\nCrypto 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.\n\n**Metadata:**\nYou can attach metadata to any deposit destination you create to track the purpose or source of deposits.\n\n\n**Example:**\n```json\n{\n  \"depositDestinationId\": \"depositDestination_123\",\n  \"accountId\": \"account_456\",\n  \"type\": \"crypto\",\n  \"crypto\": {\n    \"network\": \"base\",\n    \"address\": \"0x742d35Cc6634C0532925a3b844Bc454e4438f44e\"\n  },\n  \"target\": {\n    \"accountId\": \"account_789\",\n    \"asset\": \"usd\"\n  },\n  \"status\": \"active\",\n  \"metadata\": {\n    \"customer_id\": \"cust_789\",\n    \"reference\": \"order-12345\"\n  }\n}\n```\nUse the list endpoint to retrieve all deposit destinations."},{"name":"End User Account Management","x-audience":"public","x-slo-tier":{"tier":"ga"},"description":"The End User Account Management APIs enable developers to manage the accounts belonging to their end users. End user accounts are typically created by end users themselves when they sign in to the developer's application via the CDP Web SDK. However, developers also have the option of creating end user accounts on behalf of their end users. Critically, developers do not have the ability to sign transactions or messages on behalf of the end user; only end users can do this.\n\nEnd User Account Management APIs are accessed by the developer's servers and authenticated by the developer's CDP API key."},{"name":"End User Accounts","x-audience":"public","x-slo-tier":{"tier":"ga"},"description":"The End User Accounts APIs enable end users to directly create, manage, and use their accounts. They are typically accessed via the CDP Web SDK, which handles end-user authentication and Temporary Wallet Secret management on behalf of the developer. The End User Accounts APIs offer end users full control over their accounts, including the ability to sign transactions and messages, and to export their accounts' private keys.\n\n## Delegated Signing\n\nDelegated signing allows developers to sign and send transactions on behalf of an end user without requiring the end user to be present at signing time. This is useful for background operations, automated workflows, and scenarios where the developer's server needs to act on the end user's behalf.\n\nTo use delegated signing, the end user must first create a short-lived **delegation grant** by authenticating with their access token and Temporary Wallet Secret. The grant specifies an `expiresAt` timestamp that defines how long the developer is authorized to sign on the end user's behalf.\n\nOnce a delegation grant is active, the developer's server can use its CDP API key to perform signing operations for that end user. The delegation middleware transparently validates that an active (non-expired, non-revoked) grant exists for the `{project, user}` pair before allowing the operation to proceed.\n\n**Grant lifecycle:**\n\n  - Delegation grants are scoped to a single project and end user pair.\n  - Grants are time-bounded by the `expiresAt` timestamp and are automatically cleaned up after expiration.\n  - Grants can be revoked early by either the end user (using their access token and TWS) or the\n    developer (using their API key), via the `RevokeDelegationForEndUser` endpoint.\n  - Only one active grant can exist per `{project, user}` pair at a given time."},{"name":"EVM Accounts","x-audience":"public","x-slo-tier":{"tier":"ga"},"description":"The EVM Account APIs enable you to create and use accounts across blockchains that are compatible with the Ethereum Virtual Machine (EVM).\n\nAn **account** is a private/public key pair that is used to sign transactions and messages. The private key is generated and used only in CDP's Trusted Execution Environment (TEE), and never exposed to Coinbase or the developer.\n\nAn EVM account is identified by its **address**, which is a 0x-prefixed hexadecimal string. The same address can be used across multiple EVM networks.\n\nAccounts can optionally be assigned an **account name** at creation time for easier identification in subsequent API calls. EVM account names must be globally unique across all EVM accounts in the developer's CDP Project.\n\n## Authentication\n\nThe EVM Account API uses two layers of authentication to ensure the security of your accounts' private keys:\n\n- **CDP Secret API Key**: This key is used to authenticate all requests to the entire suite of\n   REST APIs offered on Coinbase Developer Platform.\n- **Wallet Secret**: This secret is used specifically to authenticate sensitive wallet operations\n  to `POST` and `DELETE` endpoints in the EVM and Solana Account APIs.\n\n\nTo learn more about creating and using these keys, visit our [Authentication docs](https://docs.cdp.coinbase.com/api-reference/v2/authentication).\n\n<Tip>\n\n\n**Use our SDK**\n\n\nThe [CDP SDK](https://github.com/coinbase/cdp-sdk) automatically authenticates requests using your CDP Secret API Key and Wallet Secret. Use the CDP SDK for a more convenient access to our APIs.\n\n\n</Tip>"},{"name":"EVM Smart Accounts","x-audience":"public","x-slo-tier":{"tier":"ga"},"description":"The EVM Smart Account APIs enable you to create and manage Smart Account wallets across EVM-compatible blockchains.\n\nA **Smart Account** is an EVM account that enables enhanced functionality such as account abstraction, batched transactions, and gas sponsorship through [ERC-4337](https://eips.ethereum.org/EIPS/eip-4337). Smart Accounts allow users to create and manage \"user operations\" instead of traditional EVM transactions.\nSmart Accounts are identified by their **address**, which is a 0x-prefixed hexadecimal string.\nSmart Accounts can be assigned an optional **name** at creation time for easier identification in subsequent API calls.\n\nA Smart Account has a single owner, which is another EVM Account which signs the Smart Account's transactions. The owner can be a CDP EVM account, or an account managed solely by the developer."},{"name":"EVM Swaps","x-audience":"public","x-slo-tier":{"tier":"beta"},"description":"A swap refers to the act of exchanging one token for another. The EVM Swap APIs enable you to create and manage swaps. A swap process involves:\n\n 1. A user approves token spending via smart contract.\n 2. The smart contract determines the exchange rate and facilitates the swap between the two tokens.\n 3. The transaction is completed atomically and the tokens are transferred to the user's wallet.\n\nThe Swap API supports:\n\n - **Getting a price**: Estimate the amount of tokens you will receive for a given amount of exchanged tokens.\n - **Creating a swap quote**: Return a swap transaction payload that you can use to sign and submit in order to execute the swap.\n\nFor the easiest experience creating, signing, and submitting a swap, we recommend using the [CDP SDK](https://github.com/coinbase/cdp-sdk/).\n- [Python SDK examples](https://github.com/coinbase/cdp-sdk/tree/main/python#evm-swaps)\n- [TypeScript SDK examples](https://github.com/coinbase/cdp-sdk/tree/main/typescript#evm-swaps)\n\nTo read more about using the EVM Swap APIs, please see our [Swap API docs](https://docs.cdp.coinbase.com/swaps/docs/welcome)."},{"name":"EVM Token Balances","x-audience":"public","x-slo-tier":{"tier":"ga"},"description":"The EVM Token Balances APIs enable you to retrieve the balances of EVM addresses.\nThis includes tokens (i.e. ERC-20s) and the native gas token of the network.\n## Denomination\n- 'amount' is denominated in the smallest indivisible unit of the token. For ETH, the smallest indivisible unit is Wei (10^-18 ETH). For ERC-20s, the smallest unit is the unit returned from `function totalSupply() public view returns (uint256)`.\n- 'decimals' is the exponential value N that satisfies the equation `amount * 10^-N = standard_denomination`. The standard denomination is the most commonly used denomination for the token.\n\n  - In the case of the native gas token, `decimals` is defined via convention. As an example, for ETH of Ethereum mainnet, the standard denomination is 10^-18 the smallest denomination (Wei). As such, for ETH on Ethereum mainnet, `decimals` is 18.\n  - In the case of ERC-20 tokens, `decimals` is defined via configuration. `decimals` will be the number returned by `function decimals() public view returns (uint8)` on the underlying token contract."},{"name":"Faucets","x-audience":"public","x-slo-tier":{"tier":"ga"},"description":"The Faucet APIs enable you to request funds on supported test networks. Faucets are for testing purposes and make development easier by providing a source of funds."},{"name":"Onchain Data","x-audience":"public","x-slo-tier":{"tier":"ga"},"description":"Query and analyze blockchain data with high performance and reliability. Features include real-time token balances, token discovery, and transaction history with freshness, accuracy, and completeness like never before."},{"name":"Onramp","x-audience":"public","x-slo-tier":{"tier":"ga"},"description":"The v2 Onramp APIs are an evolution of our [v1 APIs](https://docs.cdp.coinbase.com/api-reference/rest-api/onramp-offramp/), designed to make the fiat-to-crypto experience feel native to your applications for higher conversion and less friction. These APIs only cover a subset of Coinbase Onramp functionality as described below, for all other use cases please refer to our [v1 APIs](https://docs.cdp.coinbase.com/api-reference/rest-api/onramp-offramp/).\n\n## Supported Use Cases\n\n#### Apple Pay Onramp\n\nThis use case allows you to offer an Apple Pay onramp experience with debit cards in your app without users needing to create or log into a Coinbase account. Our API returns a `paymentLink` URL that renders an Apple Pay button for you to load in a webview or iframe in your app, making the onramp experience feel native to your application.\n\nRefer to our [detailed integration guide](https://docs.cdp.coinbase.com/onramp-&-offramp/onramp-apis/apple-pay-onramp-api) for more information on the limitations and requirements of this use case. See our [onramp mobile demo app](https://github.com/coinbase/onramp-demo-mobile) for a reference implementation.\n\n#### Hosted UI Onramp\n\nThis use case enables you to offer a full-featured onramp experience by redirecting users to a Coinbase-hosted page where they can choose to log into their existing Coinbase account or proceed as a guest. The Onramp Session API generates secure, single-use Onramp URLs with customizable parameters, allowing you to control available payment methods, preset transaction amounts, and cryptocurrencies for a tailored user experience.\n\nRefer to our [guide](https://docs.cdp.coinbase.com/onramp-&-offramp/onramp-apis/generating-onramp-url) for implementation details and customization options for this use case."},{"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":"Policy Engine","x-audience":"public","x-slo-tier":{"tier":"ga"},"description":"The Policy Engine APIs evaluate policies (a set of rules) to govern the behavior of accounts or projects, such as enforce allowlists and denylists.\n- A **policy** is a collection of `rules` with defined criteria.\n- Each **rule** contains a specified `action`, `operation`, and `criteria`:\n  - An `action` can either `accept` or `reject` a transaction if the criteria in the rule are met.\n  - `criteria` is an array of logical expressions. All parameters must evaluate to true for the action to be applied.\n  - An `operation` corresponds to a CDP v2 API:\n      - `signEvmTransaction` or `signSolTransaction` for signing transactions (to set a transaction limit).\n      - `sendEvmTransaction` for signing a transaction, and sending it to a supported network.\n      - `signEvmHash` for signing an arbitrary 32 byte hash.\n      - `signEvmMessage` for signing an [EIP-191](https://eips.ethereum.org/EIPS/eip-191) message.\n      - `prepareUserOperation` for preparing user operations on a smart account.\n      - `sendUserOperation` for sending user operations using a smart account.\n      - `signEndUserEvmTransaction` or `signEndUserSolTransaction` for signing end user transactions (to set a transaction limit).\n      - `sendEndUserEvmTransaction` for signing an end user transaction, and sending it to a supported EVM network.\n      - `sendEndUserSolTransaction` for signing an end user transaction, and sending it to a supported Solana network.\n      - `signEndUserEvmMessage` for signing an end user [EIP-191](https://eips.ethereum.org/EIPS/eip-191) message.\n      - `signEndUserEvmTypedData` for signing end user [EIP-712](https://eips.ethereum.org/EIPS/eip-712) typed data.\n      - `signEndUserSolMessage` for signing an end user Solana message.\n- A **rule** indicates how an operation should behave, specifying whether a request with defined criteria should be accepted or rejected.\n## Policy Scope\nPolicies can be applied at the project and/or account level:\n- **Project-level policy**: A `project`-level policy applies to all accounts in a CDP Project. Only one project-level policy can be applied to accounts within a CDP Project at any given time.\n- **Account-level policy**: An `account`-level policy applies to one or more accounts. An account\n  can have at most one account-level policy at any given time.\n\nThus, a single account can be assigned at most two policies at any given time: one project-level policy and one account-level policy.\n\n**Note:** End user operation rules (e.g., `signEndUserEvmTransaction`, `sendEndUserSolTransaction`) currently only apply for policies with the `project` scope.\n\nScope is specified in the `scope` field of a policy:\n```json {\n  \"description\": \"Project-level policy\",\n  \"scope\": \"account\",\n  ...\n```\n## Policy Evaluation\n**Project-level policies** are evaluated first, followed by **account-level policies**.\nThe Policy Engine will process the request against each rule in the order it is defined within the `rules` array:\n\n  1. If the rule's `criteria` (processed as a logical **AND** operation applied to a list of independently evaluated boolean expressions) are met, `accept` or `reject` behavior is applied immediately and the engine stops further evaluation of the policy.\n  1. If after policy evaluation, no rule's `criteria` are met, the engine moves to processing the next policy (i.e., an `account`-level policy).\n  1. If no further policies exist, the request is rejected.\n\nFor example, the following policy is a project-level policy with two rules. The Policy Engine will:\n\n   1. **Evaluate the first rule:** For a `signEvmTransaction` request, accept the request if the transaction is less than or equal to 1000000000000000000 wei OR\n   1. **Evaluate the second rule:** if the request is a `signEvmTransaction` request, accept the request if the transaction is less than or equal to 2000000000000000000 wei AND the request is made to the address `0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE`.\n   1. **If the request does not meet the criteria of either rule**, the engine will move on to evaluate an `account`-level policy (if one exists).\n   1. Otherwise, the request is rejected.\n\nRules are processed in the order they are defined. Once a rule applies to an operation, subsequent rules are ignored.\n```json\n{\n  \"description\": \"Project-level policy\",\n  \"scope\": \"project\",\n  \"rules\": [\n    {\n      \"action\": \"accept\",\n      \"operation\": \"signEvmTransaction\",\n      \"criteria\": [\n        {\n          \"type\": \"ethValue\",\n          \"ethValue\": \"1000000000000000000\",\n          \"operator\": \"<=\"\n        }\n      ]\n    },\n    {\n      \"action\": \"accept\",\n      \"operation\": \"signEvmTransaction\",\n      \"criteria\": [\n        {\n          \"type\": \"ethValue\",\n          \"ethValue\": \"2000000000000000000\",\n          \"operator\": \"<=\"\n        },\n        {\n          \"type\": \"evmAddress\",\n          \"addresses\": [\n            \"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE\"\n          ],\n          \"operator\": \"in\"\n        }\n      ]\n    }\n  ]\n}\n```\n\n## Policy Application\n\nProject-level policies are applied to all accounts in a CDP Project. They will apply retroactively even if the project-level policy is created after the account was created. To disable a project-level policy, you must remove the project-level policy from the CDP Project using the `deletePolicy` operation.\n\nAccount-level policies can be applied in two ways:\n- By specifying the `accountPolicy` field in the request body of the `createEvmAccount` and\n  `createSolAccount` operations.\n\n- By specifying the `accountPolicy` field in the request body of the `updateEvmAccount` and\n  `updateSolanaAccount` operations.\n\n\n## Criteria\n\nThe following criteria are supported:\n\n### SignEvmTransaction Criteria\n#### ethValue\nA criterion based on the value of the transaction. The transaction's `value` field is compared to the criterion's `ethValue` field using the `operator` field.\n#### evmAddress\nA criterion based on the recipient address of the transaction. The transaction's `to` field is compared to the criterion's `addresses` field using the `operator` field.\n#### evmData\nA criterion based on encoded transaction data that evaluates the function being called, as well as any number of arguments accessed by either name or index. Currently this criterion only supports primitive types; `string`, `bool`, `uint(8,16,32,64,256)`, `int(8,16,32,64,256)`, `address`, and both fixed and dynamic length `bytes`.\n#### netUSDChange\nA criterion based on the USD denominated market value of assets being transferred, or exposing the sender to. The types of assets included in the calculation include native assets, `ERC20`, `ERC721`, and `ERC1155` tokens. The sum total USD amount of assets being transferred and exposed is compared to the criterion's `changeCents` field using the `operator` field. If signing a testnet transaction, then this criterion configuration will be ignored.\n### SendEvmTransaction Criteria\n#### ethValue\nA criterion based on the value of the transaction. The transaction's `value` field is compared to the criterion's `ethValue` field using the `operator` field.\n#### evmAddress\nA criterion based on the recipient address of the transaction. The transaction's `to` field is compared to the criterion's `addresses` field using the `operator` field.\n#### evmNetwork\nA criterion based on the intended network of the transaction. The `network` field in the `sendEvmTransaction` request body is compared to the criterion's `networks` field using the `operator` field.\nValid networks for this criterion include:\n  - `base`\n  - `base-sepolia`\n  - `ethereum`\n  - `ethereum-sepolia`\n  - `avalanche`\n  - `polygon`\n  - `optimism`\n  - `arbitrum`\n  - `arbitrum-sepolia`\n  - `world`\n  - `world-sepolia`\n\n#### evmData\nA criterion based on encoded transaction data that evaluates the function being called, as well as any number of arguments accessed by either name or index. Currently this criterion only supports primitive types; `string`, `bool`, `uint(8,16,32,64,256)`, `int(8,16,32,64,256)`, `address`, and both fixed and dynamic length `bytes`.\n#### netUSDChange\nA criterion based on the USD denominated market value of assets being transferred, or exposing the sender to. The types of assets included in the calculation include native assets, `ERC20`, `ERC721`, and `ERC1155` tokens. The sum total USD amount of assets being transferred and exposed is compared to the criterion's `changeCents` field using the `operator` field. If sending a testnet transaction, then this criterion configuration will be ignored.\n### SendUserOperation Criteria\n#### ethValue\nA criterion based on the value of the user operation. The operation's `value` fields are compared to the criterion's `ethValue` field using the `operator` field.\n#### evmAddress\nA criterion based on the recipient address of the operation. The operation's `to` fields are compared to the criterion's `addresses` field using the `operator` field.\n#### evmData\nA criterion based on encoded transaction data that evaluates the function being called, as well as any number of arguments accessed by either name or index. Currently this criterion only supports primitive types; `string`, `bool`, `uint(8,16,32,64,256)`, `int(8,16,32,64,256)`, `address`, and both fixed and dynamic length `bytes`.\n### PrepareUserOperation Criteria\n#### ethValue\nA criterion based on the value of the user operation. The operation's `value` fields are compared to the criterion's `ethValue` field using the `operator` field.\n#### evmAddress\nA criterion based on the recipient address of the user operation. The operation's `to` fields are compared to the criterion's `addresses` field using the `operator` field.\n#### evmNetwork\nA criterion based on the intended network of the user operation. The `network` field in the `prepareUserOperation` request body is compared to the criterion's `networks` field using the `operator` field.\nValid networks for this criterion include:\n  - `base-sepolia`\n  - `base`\n  - `arbitrum`\n  - `optimism`\n  - `zora`\n  - `polygon`\n  - `bnb`\n  - `avalanche`\n  - `ethereum`\n  - `ethereum-sepolia`\n\n#### evmData\nA criterion based on encoded transaction data that evaluates the function being called, as well as any number of arguments accessed by either name or index. Currently this criterion only supports primitive types; `string`, `bool`, `uint(8,16,32,64,256)`, `int(8,16,32,64,256)`, `address`, and both fixed and dynamic length `bytes`.\n### SignEvmHash Criteria\nThe `signEvmHash` operation does not accept any criteria. To prevent this operation from being executed by any account, specify a rule with `signEvmHash` as the operation, and `reject` as its action.\n### SignEvmMessage Criteria\n#### evmMessage\nA criterion based on the intended message to be signed. The `match` field in the criteria is a [RE2](https://github.com/google/re2/wiki/Syntax) compliant regular expression that will be executed against the message in the API request.\n### SignSolMessage Criteria\n#### solMessage\nA criterion based on the intended message to be signed. The `match` field in the criteria is a [RE2](https://github.com/google/re2/wiki/Syntax) compliant regular expression that will be executed against the message in the API request.\n### SignSolTransaction Criteria\n#### solAddress\nA criterion based on the recipient addresses of the transaction. The criterion's `address` field is compared to the list of addresses in the transaction's `accountKeys` (for legacy transactions) or `staticAccountKeys` (for V0 transactions) array using the `operator` field.\n#### solValue\nA criterion based on the value of the transaction. The criterion's `solValue` field is compared to the transaction's `value`, which is the amount of SOL in lamports being transferred, using the `operator` field.\n#### splAddress\nA criterion based on the recipient addresses of SPL token transfer instructions in the transaction. The criterion's `addresses` field is compared to the list of SPL token transfer recipient addresses in the transaction's `accountKeys` (for legacy transactions) or `staticAccountKeys` (for V0 transactions) array using the `operator` field.\n#### splValue\nA criterion based on the SPL token value of SPL token transfer instructions in the transaction. The criterion's `splValue` field is compared to the transaction instruction's `value` field, which is the amount of the SPL token being transferred, using the `operator` field.\n#### mintAddress\nA criterion based on the token mint addresses of SPL token transfer instructions in the transaction. The criterion's `addresses` field is compared to the list of token mint addresses in the transaction's `accountKeys` (for legacy transactions) or `staticAccountKeys` (for V0 transactions) array using the `operator` field.\n#### solData\nA criterion based on Solana transaction instruction data. The criterion uses Interface Definition Language (IDL) specifications to decode and validate instruction data against specific rules. The `idls` field specifies which Solana programs to validate against (either known program names like \"SystemProgram\" and \"TokenProgram\", or custom IDL objects), and the `conditions` field defines instruction-specific validation rules including instruction names and parameter constraints.\n#### programId\nA criterion based on the program IDs of a transaction's instructions. The criterion's `programIds` field is compared to the list of program IDs in the transaction's instructions using the `operator` field.\n### SendSolTransaction Criteria\n#### solAddress\nA criterion based on the recipient addresses of the transaction. The criterion's `address` field is compared to the list of addresses in the transaction's `accountKeys` (for legacy transactions) or `staticAccountKeys` (for V0 transactions) array using the `operator` field.\n#### solValue\nA criterion based on the value of the transaction. The criterion's `solValue` field is compared to the transaction's `value`, which is the amount of SOL in lamports being transferred, using the `operator` field.\n#### splAddress\nA criterion based on the recipient addresses of SPL token transfer instructions in the transaction. The criterion's `addresses` field is compared to the list of SPL token transfer recipient addresses in the transaction's `accountKeys` (for legacy transactions) or `staticAccountKeys` (for V0 transactions) array using the `operator` field.\n#### splValue\nA criterion based on the SPL token value of SPL token transfer instructions in the transaction. The criterion's `splValue` field is compared to the transaction instruction's `value` field, which is the amount of the SPL token being transferred, using the `operator` field.\n#### mintAddress\nA criterion based on the token mint addresses of SPL token transfer instructions in the transaction. The criterion's `addresses` field is compared to the list of token mint addresses in the transaction's `accountKeys` (for legacy transactions) or `staticAccountKeys` (for V0 transactions) array using the `operator` field.\n#### solData\nA criterion based on Solana transaction instruction data. The criterion uses Interface Definition Language (IDL) specifications to decode and validate instruction data against specific rules. The `idls` field specifies which Solana programs to validate against (either known program names like \"SystemProgram\" and \"TokenProgram\", or custom IDL objects), and the `conditions` field defines instruction-specific validation rules including instruction names and parameter constraints.\n#### programId\nA criterion based on the program IDs of a transaction's instructions. The criterion's `programIds` field is compared to the list of program IDs in the transaction's instructions using the `operator` field.\n#### solNetwork\nA criterion based on the intended network of the transaction. The `network` field in the `sendSolanaTransaction` request body is compared to the criterion's `networks` field using the `operator` field.\nValid networks for this criterion include:\n  - `solana-devnet`\n  - `solana`\n\n## End User Criteria for User Wallets\nEnd user criteria apply to operations performed by end users via user wallets. These criteria are only evaluated for policies with the `project` scope. The supported criterion types for each end user operation mirror their non-end-user counterparts.\n### SignEndUserEvmTransaction Criteria\n#### ethValue\nA criterion based on the value of the transaction. The transaction's `value` field is compared to the criterion's `ethValue` field using the `operator` field.\n#### evmAddress\nA criterion based on the recipient address of the transaction. The transaction's `to` field is compared to the criterion's `addresses` field using the `operator` field.\n#### evmData\nA criterion based on encoded transaction data that evaluates the function being called, as well as any number of arguments accessed by either name or index. Currently this criterion only supports primitive types; `string`, `bool`, `uint(8,16,32,64,256)`, `int(8,16,32,64,256)`, `address`, and both fixed and dynamic length `bytes`.\n#### netUSDChange\nA criterion based on the USD denominated market value of assets being transferred, or exposing the sender to. The types of assets included in the calculation include native assets, `ERC20`, `ERC721`, and `ERC1155` tokens. The sum total USD amount of assets being transferred and exposed is compared to the criterion's `changeCents` field using the `operator` field. If signing a testnet transaction, then this criterion configuration will be ignored.\n### SendEndUserEvmTransaction Criteria\n#### ethValue\nA criterion based on the value of the transaction. The transaction's `value` field is compared to the criterion's `ethValue` field using the `operator` field.\n#### evmAddress\nA criterion based on the recipient address of the transaction. The transaction's `to` field is compared to the criterion's `addresses` field using the `operator` field.\n#### evmNetwork\nA criterion based on the intended network of the transaction. The `network` field in the `sendEndUserEvmTransaction` request body is compared to the criterion's `networks` field using the `operator` field.\nValid networks for this criterion include:\n  - `base`\n  - `base-sepolia`\n  - `ethereum`\n  - `ethereum-sepolia`\n  - `avalanche`\n  - `polygon`\n  - `optimism`\n  - `arbitrum`\n\n#### evmData\nA criterion based on encoded transaction data that evaluates the function being called, as well as any number of arguments accessed by either name or index. Currently this criterion only supports primitive types; `string`, `bool`, `uint(8,16,32,64,256)`, `int(8,16,32,64,256)`, `address`, and both fixed and dynamic length `bytes`.\n#### netUSDChange\nA criterion based on the USD denominated market value of assets being transferred, or exposing the sender to. The types of assets included in the calculation include native assets, `ERC20`, `ERC721`, and `ERC1155` tokens. The sum total USD amount of assets being transferred and exposed is compared to the criterion's `changeCents` field using the `operator` field. If sending a testnet transaction, then this criterion configuration will be ignored.\n### SignEndUserEvmMessage Criteria\n#### evmMessage\nA criterion based on the intended message to be signed. The `match` field in the criteria is a [RE2](https://github.com/google/re2/wiki/Syntax) compliant regular expression that will be executed against the message in the API request.\n### SignEndUserEvmTypedData Criteria\n#### evmTypedDataField\nA criterion based on the fields of the [EIP-712](https://eips.ethereum.org/EIPS/eip-712) typed data being signed. The `types` field specifies the EIP-712 type definitions and primary type, while the `conditions` field defines validation rules for specific fields within the typed data message. Conditions can target address fields, numerical fields, or string fields, and can reference deeply nested values using dot-separated paths.\n#### evmTypedDataVerifyingContract\nA criterion based on the verifying contract address in the [EIP-712](https://eips.ethereum.org/EIPS/eip-712) domain separator. The domain's `verifyingContract` field is compared to the criterion's `addresses` field using the `operator` field.\n### SignEndUserSolTransaction Criteria\n#### solAddress\nA criterion based on the recipient addresses of the transaction. The criterion's `address` field is compared to the list of addresses in the transaction's `accountKeys` (for legacy transactions) or `staticAccountKeys` (for V0 transactions) array using the `operator` field.\n#### solValue\nA criterion based on the value of the transaction. The criterion's `solValue` field is compared to the transaction's `value`, which is the amount of SOL in lamports being transferred, using the `operator` field.\n#### splAddress\nA criterion based on the recipient addresses of SPL token transfer instructions in the transaction. The criterion's `addresses` field is compared to the list of SPL token transfer recipient addresses in the transaction's `accountKeys` (for legacy transactions) or `staticAccountKeys` (for V0 transactions) array using the `operator` field.\n#### splValue\nA criterion based on the SPL token value of SPL token transfer instructions in the transaction. The criterion's `splValue` field is compared to the transaction instruction's `value` field, which is the amount of the SPL token being transferred, using the `operator` field.\n#### mintAddress\nA criterion based on the token mint addresses of SPL token transfer instructions in the transaction. The criterion's `addresses` field is compared to the list of token mint addresses in the transaction's `accountKeys` (for legacy transactions) or `staticAccountKeys` (for V0 transactions) array using the `operator` field.\n#### solData\nA criterion based on Solana transaction instruction data. The criterion uses Interface Definition Language (IDL) specifications to decode and validate instruction data against specific rules. The `idls` field specifies which Solana programs to validate against (either known program names like \"SystemProgram\" and \"TokenProgram\", or custom IDL objects), and the `conditions` field defines instruction-specific validation rules including instruction names and parameter constraints.\n#### programId\nA criterion based on the program IDs of a transaction's instructions. The criterion's `programIds` field is compared to the list of program IDs in the transaction's instructions using the `operator` field.\n### SendEndUserSolTransaction Criteria\n#### solAddress\nA criterion based on the recipient addresses of the transaction. The criterion's `address` field is compared to the list of addresses in the transaction's `accountKeys` (for legacy transactions) or `staticAccountKeys` (for V0 transactions) array using the `operator` field.\n#### solValue\nA criterion based on the value of the transaction. The criterion's `solValue` field is compared to the transaction's `value`, which is the amount of SOL in lamports being transferred, using the `operator` field.\n#### splAddress\nA criterion based on the recipient addresses of SPL token transfer instructions in the transaction. The criterion's `addresses` field is compared to the list of SPL token transfer recipient addresses in the transaction's `accountKeys` (for legacy transactions) or `staticAccountKeys` (for V0 transactions) array using the `operator` field.\n#### splValue\nA criterion based on the SPL token value of SPL token transfer instructions in the transaction. The criterion's `splValue` field is compared to the transaction instruction's `value` field, which is the amount of the SPL token being transferred, using the `operator` field.\n#### mintAddress\nA criterion based on the token mint addresses of SPL token transfer instructions in the transaction. The criterion's `addresses` field is compared to the list of token mint addresses in the transaction's `accountKeys` (for legacy transactions) or `staticAccountKeys` (for V0 transactions) array using the `operator` field.\n#### solData\nA criterion based on Solana transaction instruction data. The criterion uses Interface Definition Language (IDL) specifications to decode and validate instruction data against specific rules. The `idls` field specifies which Solana programs to validate against (either known program names like \"SystemProgram\" and \"TokenProgram\", or custom IDL objects), and the `conditions` field defines instruction-specific validation rules including instruction names and parameter constraints.\n#### programId\nA criterion based on the program IDs of a transaction's instructions. The criterion's `programIds` field is compared to the list of program IDs in the transaction's instructions using the `operator` field.\n#### solNetwork\nA criterion based on the intended network of the transaction. The `network` field in the `sendEndUserSolTransaction` request body is compared to the criterion's `networks` field using the `operator` field.\nValid networks for this criterion include:\n  - `solana-devnet`\n  - `solana`\n\n### SignEndUserSolMessage Criteria\n#### solMessage\nA criterion based on the intended message to be signed. The `match` field in the criteria is a [RE2](https://github.com/google/re2/wiki/Syntax) compliant regular expression that will be executed against the message in the API request.\n## Restricting Contract Interactions on Ethereum\nSmart contract function restrictions serve as a critical security and governance mechanism in decentralized applications, allowing developers and organizations to implement fine-grained access controls over their protocol interactions.\nOne of the primary use cases for function restrictions is protecting high-risk operations from unauthorized access such as:\n- Fund transfers - Contract upgrades - Parameter modifications - Emergency pauses\nPolicy Engine supports such restrictions that evaluate against transaction data with the `evmData` criterion for the `signEvmTransaction`, and `sendEvmTransaction` operations.\n## Examples\n### USD Limits\nThe following example demonstrates a policy that only allows transactions to transfer, or expose the sender to, less than $100.00 worth of assets at a time. This USD denominated amount includes native assets, `ERC20`, `ERC721`, and `ERC1155` tokens calculated using current market prices.\n```json {\n  \"scope\": \"account\",\n  \"description\": \"Reject assets out over 100 USD\",\n  \"rules\": [\n    {\n      \"action\": \"reject\",\n      \"operation\": \"sendEvmTransaction\",\n      \"criteria\": [\n        {\n          \"type\": \"netUSDChange\",\n          \"changeCents\": 10000,\n          \"operator\": \">\",\n        },\n      ],\n    },\n    {\n      \"action\": \"reject\",\n      \"operation\": \"signEvmTransaction\",\n      \"criteria\": [\n        {\n          \"type\": \"netUSDChange\",\n          \"changeCents\": 10000,\n          \"operator\": \">\",\n        },\n      ],\n    },\n  ],\n} ```\n### Limiting USDC Spend\nThis policy restricts USDC transactions on the Base network to transfers of 10,000 tokens or less. It applies to both signing and sending transactions to the USDC contract address, using the ERC20 ABI to validate that only `transfer` function calls with a `value` parameter under the specified limit are permitted.\n```json {\n  \"description\": \"Limit USDC Spend\",\n  \"scope\": \"account\",\n  \"rules\": [\n    {\n      \"action\": \"accept\",\n      \"operation\": \"sendEvmTransaction\",\n      \"criteria\": [\n        {\n          \"type\": \"evmNetwork\",\n          \"networks\": [\"base\"],\n          \"operator\": \"in\"\n        },\n        {\n          \"type\": \"evmAddress\",\n          \"addresses\": [\"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\"],\n          \"operator\": \"in\"\n        },\n        {\n          \"type\": \"evmData\",\n          \"abi\": \"erc20\",\n          \"conditions\": [\n            {\n              \"function\": \"transfer\",\n              \"params\": [\n                {\n                  \"name\": \"value\",\n                  \"operator\": \"<=\",\n                  \"value\": \"10000\"\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"action\": \"accept\",\n      \"operation\": \"signEvmTransaction\",\n      \"criteria\": [\n        {\n          \"type\": \"evmAddress\",\n          \"addresses\": [\"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\"],\n          \"operator\": \"in\"\n        },\n        {\n          \"type\": \"evmData\",\n          \"abi\": \"erc20\",\n          \"conditions\": [\n            {\n              \"function\": \"transfer\",\n              \"params\": [\n                {\n                  \"name\": \"value\",\n                  \"operator\": \"<=\",\n                  \"value\": \"10000\"\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    }\n  ]\n} ```."},{"name":"Solana Accounts","x-audience":"public","x-slo-tier":{"tier":"ga"},"description":"The Solana Account APIs enable you to create and use Solana accounts across SVM-compatible blockchains.\n\nAn **account** is a private/public key pair that is used to sign transactions and messages. The private key is generated and used only in CDP's Trusted Execution Environment (TEE), and never exposed to Coinbase or the developer.\n\nA Solana account is identified by its **address**, which is a base-58 encoded string.\n\nAccounts can optionally be assigned an **account name** at creation time for easier identification in subsequent API calls. Solana account names must be globally unique across all Solana accounts in the developer's CDP Project.\n\n## Authentication\n\nThe Solana Account APIs use two layers of authentication to ensure the security of your accounts' private keys:\n\n- **CDP Secret API Key**: This key is used to authenticate all requests to the entire suite of\n   REST APIs offered on Coinbase Developer Platform.\n- **Wallet Secret**: This secret is used specifically to authenticate sensitive wallet operations\n  to `POST` and `DELETE` endpoints in the EVM and Solana Account APIs.\n\n\nTo learn more about creating and using these keys, visit our [Authentication docs](https://docs.cdp.coinbase.com/api-reference/v2/authentication).\n\n<Tip>\n\n\n**Use our SDK**\n\n\nThe [CDP SDK](https://github.com/coinbase/cdp-sdk) automatically authenticates requests using your CDP Secret API Key and Wallet Secret. Use the CDP SDK for a more convenient access to our APIs.\n\n\n</Tip>"},{"name":"Solana Token Balances","x-audience":"public","x-slo-tier":{"tier":"ga"},"description":"The Solana Token Balances APIs enable you to retrieve the balances of Solana addresses.\nThis includes SPL tokens and the native SOL token of the network.\n## Denomination\n- 'amount' is denominated in the smallest indivisible unit of the token. For SOL, the smallest indivisible unit is lamports (10^-9 SOL). For SPL tokens, the smallest unit is defined by the token's decimals configuration.\n- 'decimals' is the exponential value N that satisfies the equation `amount * 10^-N = standard_denomination`. The standard denomination is the most commonly used denomination for the token.\n\n  - For native SOL, `decimals` is 9 (1 SOL = 10^9 lamports).\n  - For SPL tokens, `decimals` is defined in the token's mint configuration."},{"name":"SQL API","x-audience":"public","x-slo-tier":{"tier":"ga"},"description":"The SQL API enables you to write performant, high-freshness, and endlessly flexible SQL queries against onchain data."},{"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.\n## Fee Quotes\nEvery 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.\n\nTo review fees before execution:\n1. Create a transfer with `execute: false`\n2. Review the `fees` array in the response\n3. Call `POST /transfers/{transferId}/execute` when ready to proceed\n\n\nFor automatic execution without fee review, create a transfer with `execute: true`.\n\n**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.\n## Fees\nTransfer fees vary by source, target, amount and transfer type:\n* **Bank fees** - Traditional banking fees for depositing funds (e.g., $15.00 wire transfer fee)\n* **Conversion fees** - Fees for exchanging between different assets\n* **Network fees** - Onchain transaction costs to complete the transfer (e.g., ETH gas fees)\n\nAll fees are disclosed upfront in the `fees` array when you create a transfer.\n## Transfer Lifecycle\nWhen you create a transfer, it will be in one of these statuses that determine what action you need to take:\n* **`quoted`** - Transfer is ready but requires manual execution via the `/execute` endpoint\n* **`processing`** - Transfer is being executed (no action needed - poll for completion)\n* **`completed`** - Transfer completed successfully\n* **`failed`** - Transfer failed (see `failureReason` for details)\n## Execution Control\n* **`execute: true`**: Transfer will automatically attempt to execute\n* **`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.\n## Sources and Targets\n* A **source** can be an Account or a Payment Method\n* A **target** can be an Account, Payment Method, Onchain Address, or Email Address\n## Transfer Execution\nWhen a transfer reaches `completed` status, it contains the final execution details that delivered funds to the target and completion timestamps.\n## Failure Reasons\nWhen a transfer fails, the `failureReason` field provides a human-readable description of what went wrong.\nCommon failure reasons include:\n* \"Insufficient balance to complete this transfer.\"\n* \"The recipient address is invalid for the selected network.\"\n* \"The recipient address failed security validation checks.\"\n* \"Unable to send to this recipient.\"\n\nFailure reason is only present when the transfer's status is `failed`."},{"name":"Wallet Webhooks","x-audience":"public","x-slo-tier":{"tier":"ga"},"description":"The `wallet.activity.*` webhook payloads describe wallet activity, transaction, delegation, and signing events emitted by CDP."},{"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."},{"name":"x402 Facilitator","x-audience":"public","x-slo-tier":{"tier":"beta"},"description":"The x402 payment protocol is an HTTP-based payment protocol that enables developers running resource servers to accept payments from users using a variety of payment methods.\nFor more details on the x402 payment protocol, please see the [x402 specification](https://www.x402.org/).\nThe x402 Facilitator APIs enable you to facilitate payments using the x402 payment protocol by exposing two APIs:\n- `POST /v2/x402/verify`: Verify a payment with a supported scheme and network.\n- `POST /v2/x402/settle`: Settle a payment with a supported scheme and network."}],"paths":{"/v2/accounts":{"get":{"summary":"List accounts","description":"List all accounts. The API will return all accounts that the API Key has Permissions to access. You can filter the results by using query parameters, which will be treated as a single conjunction (i.e. AND). Results are sorted by creation date in descending order (newest first).","operationId":"listFoundationAccounts","tags":["Accounts"],"security":[{"apiKeyAuth":[]}],"x-audience":"public","x-required-permissions":{"permissions":["accounts:read@entity"],"enforcement":"any"},"parameters":[{"$ref":"#/components/parameters/PageSize"},{"$ref":"#/components/parameters/PageToken"},{"name":"owner","in":"query","required":false,"description":"Filter accounts by owner. Values can be specific Owner IDs or owner type wildcards. Multiple values can be combined as a comma-separated list.\n\n**Specific Owner IDs:**\n* `entity_<uuid>` - Accounts owned by a specific entity\n* `customer_<uuid>` - Accounts owned by a specific customer\n\n**Owner type wildcards:**\n* `entity` - All entity-owned accounts\n* `customer` - All customer-owned accounts\n\n**Examples:**\n* `owner=customer_af29...` - A specific customer's accounts\n* `owner=customer` - All customer accounts\n* `owner=entity,customer_af29...` - Entity accounts and a specific customer's accounts\n* When omitted, accounts with any owner are returned.","schema":{"type":"array","items":{"type":"string","description":"An owner filter value. Can be a specific Owner ID (e.g. `entity_<uuid>`, `customer_<uuid>`) or an owner type wildcard (`entity`, `customer`).","pattern":"^(entity|customer)(_[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})?$"}},"style":"form","explode":false,"examples":{"specific_customer":{"summary":"A specific customer's accounts","value":["customer_af2937b0-9846-4fe7-bfe9-ccc22d935114"]},"all_customers":{"summary":"All customer accounts","value":["customer"]},"entity_and_customer":{"summary":"Entity accounts and a specific customer's accounts","value":["entity","customer_af2937b0-9846-4fe7-bfe9-ccc22d935114"]},"all_owners":{"summary":"All accounts (entity and all customers)","value":["entity","customer"]}}},{"name":"type","in":"query","required":false,"description":"Filter accounts by account type. When omitted, accounts of any type are returned. Combined with `owner` using AND.","schema":{"$ref":"#/components/schemas/AccountType"},"example":"prime"}],"responses":{"200":{"description":"Successfully listed accounts.","content":{"application/json":{"schema":{"allOf":[{"type":"object","required":["accounts"],"properties":{"accounts":{"type":"array","description":"The list of accounts.","items":{"$ref":"#/components/schemas/Account"}}}},{"$ref":"#/components/schemas/ListResponse"}]},"examples":{"entity_owned":{"summary":"Account owned by your Entity","value":{"accounts":[{"accountId":"account_af2937b0-9846-4fe7-bfe9-ccc22d935114","type":"prime","owner":"entity_af2937b0-9846-4fe7-bfe9-ccc22d935114","name":"My Business Account","createdAt":"2023-10-08T14:30:00Z","updatedAt":"2023-10-08T14:30:00Z"}],"nextPageToken":"eyJsYXN0X2lkIjogImFiYzEyMyIsICJ0aW1lc3RhbXAiOiAxNzA3ODIzNzAxfQ=="}},"customer_owned":{"summary":"Account owned by a Customer of yours","value":{"accounts":[{"accountId":"account_af2937b0-9846-4fe7-bfe9-ccc22d935114","type":"cdp","owner":"customer_af2937b0-9846-4fe7-bfe9-ccc22d935114","name":"ABC XYZ Customer Account","createdAt":"2023-10-08T14:30:00Z","updatedAt":"2023-10-08T14:30:00Z"}],"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."}}}}}}}},"post":{"summary":"Create account","description":"Create an account. Two ownership modes are supported:\n\n- **Entity-owned**: when `owner` is omitted, the account is owned by the\n  Entity making the request. Returns an account with `owner: entity_<uuid>`.\n\n- **Customer-owned**: pass a Customer ID as `owner`\n  (e.g. `customer_af2937b0-9846-4fe7-bfe9-ccc22d935114`). The Customer\n  must have the `custodyCrypto`, `custodyFiat`, and `custodyStablecoin`\n  capabilities enabled, otherwise the request is rejected with\n  `customer_not_authorized` (HTTP 403).","operationId":"createFoundationAccount","tags":["Accounts"],"security":[{"apiKeyAuth":[]}],"x-audience":"public","x-required-permissions":{"permissions":["accounts:write@entity"],"enforcement":"any"},"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAccountRequest"},"examples":{"entity_owned":{"summary":"Create an account owned by your Entity","value":{"name":"My Business Account"}},"customer_owned":{"summary":"Create an account owned by a Customer of yours","value":{"owner":"customer_af2937b0-9846-4fe7-bfe9-ccc22d935114","name":"ABC XYZ Customer Account"}}}}}},"responses":{"200":{"description":"Successfully created account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Account"},"examples":{"entity_owned":{"summary":"Account owned by your Entity","value":{"accountId":"account_af2937b0-9846-4fe7-bfe9-ccc22d935114","type":"cdp","owner":"entity_af2937b0-9846-4fe7-bfe9-ccc22d935114","name":"My Business Account","createdAt":"2023-10-08T14:30:00Z","updatedAt":"2023-10-08T14:30:00Z"}},"customer_owned":{"summary":"Account owned by a Customer of yours","value":{"accountId":"account_af2937b0-9846-4fe7-bfe9-ccc22d935114","type":"cdp","owner":"customer_af2937b0-9846-4fe7-bfe9-ccc22d935114","name":"ABC XYZ Customer Account","createdAt":"2023-10-08T14:30:00Z","updatedAt":"2023-10-08T14:30:00Z"}}}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"Invalid account creation request."}}}}}},"403":{"description":"Customer is not authorized for one or more capabilities required by this action.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"customer_not_authorized":{"summary":"Customer is not authorized for one or more required capabilities","value":{"errorType":"customer_not_authorized","errorMessage":"Customer is not authorized for one or more capabilities required by this action.","unauthorizedCapabilities":["custodyCrypto","custodyFiat","custodyStablecoin"]}}}}}},"422":{"$ref":"#/components/responses/IdempotencyError"},"503":{"$ref":"#/components/responses/EndpointUnavailableError"}}}},"/v2/accounts/{accountId}":{"get":{"summary":"Get account","description":"Get an account by its ID.","operationId":"getFoundationAccountById","tags":["Accounts"],"security":[{"apiKeyAuth":[]}],"x-audience":"public","x-required-permissions":{"permissions":["accounts:read@entity"],"enforcement":"any"},"parameters":[{"name":"accountId","in":"path","required":true,"description":"The ID of the account to retrieve.","schema":{"$ref":"#/components/schemas/AccountId"},"example":"account_af2937b0-9846-4fe7-bfe9-ccc22d935114"}],"responses":{"200":{"description":"Successfully got account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Account"},"examples":{"entity_owned":{"summary":"Account owned by your Entity","value":{"accountId":"account_af2937b0-9846-4fe7-bfe9-ccc22d935114","type":"prime","owner":"entity_af2937b0-9846-4fe7-bfe9-ccc22d935114","name":"My Business Account","createdAt":"2023-10-08T14:30:00Z","updatedAt":"2023-10-08T14:30:00Z"}},"customer_owned":{"summary":"Account owned by a Customer of yours","value":{"accountId":"account_af2937b0-9846-4fe7-bfe9-ccc22d935114","type":"cdp","owner":"customer_af2937b0-9846-4fe7-bfe9-ccc22d935114","name":"ABC XYZ Customer Account","createdAt":"2023-10-08T14:30:00Z","updatedAt":"2023-10-08T14:30:00Z"}}}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"Invalid account ID."}}}}}},"404":{"description":"Account not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"Account not found."}}}}}}}}},"/v2/accounts/{accountId}/balances":{"get":{"summary":"List balances for account","description":"List the balances for an account. Results are sorted by native-fiat equivalent balance in descending order.","operationId":"listBalances","tags":["Accounts"],"security":[{"apiKeyAuth":[]}],"x-audience":"public","x-required-permissions":{"permissions":["accounts:read@entity"],"enforcement":"any"},"parameters":[{"name":"accountId","in":"path","required":true,"description":"The unique identifier of the account.","schema":{"$ref":"#/components/schemas/AccountId"},"example":"account_af2937b0-9846-4fe7-bfe9-ccc22d935114"},{"$ref":"#/components/parameters/PageSize"},{"$ref":"#/components/parameters/PageToken"}],"responses":{"200":{"description":"Successfully listed balances.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Balances"},{"$ref":"#/components/schemas/ListResponse"}]},"example":{"balances":[{"asset":{"symbol":"btc","type":"crypto","name":"Bitcoin","decimals":8},"amount":{"btc":{"available":"2.5","total":"3.0"},"usd":{"available":"252705.4","total":"303246.48"}}},{"asset":{"symbol":"usd","type":"fiat","name":"United States Dollar","decimals":2},"amount":{"usd":{"available":"90","total":"100"}}}],"nextPageToken":"eyJsYXN0X2lkIjogImFiYzEyMyIsICJ0aW1lc3RhbXAiOiAxNzA3ODIzNzAxfQ=="}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"Invalid account ID or query parameters."}}}}}},"401":{"description":"Unauthorized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"unauthorized":{"value":{"errorType":"unauthorized","errorMessage":"Authentication required."}}}}}},"404":{"description":"Account not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"Account not found."}}}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"internal_error":{"value":{"errorType":"internal_server_error","errorMessage":"An internal server error occurred."}}}}}},"503":{"$ref":"#/components/responses/EndpointUnavailableError"}}}},"/v2/accounts/{accountId}/balances/{asset}":{"get":{"summary":"Get balance for account","description":"Get the balance for an account by asset.","operationId":"getBalanceByAsset","tags":["Accounts"],"security":[{"apiKeyAuth":[]}],"x-audience":"public","x-required-permissions":{"permissions":["accounts:read@entity"],"enforcement":"any"},"parameters":[{"name":"accountId","in":"path","required":true,"description":"The unique identifier of the account.","schema":{"$ref":"#/components/schemas/AccountId"},"example":"account_af2937b0-9846-4fe7-bfe9-ccc22d935114"},{"name":"asset","in":"path","required":true,"description":"The symbol of the asset.","schema":{"$ref":"#/components/schemas/Asset"},"example":"btc"}],"responses":{"200":{"description":"Successfully got balance.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Balance"},"example":{"asset":{"symbol":"btc","type":"crypto","name":"Bitcoin","decimals":8},"amount":{"btc":{"available":"2.5","total":"3.0"},"usd":{"available":"252705.4","total":"303246.48"}}}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"Invalid account ID or asset symbol."}}}}}},"401":{"description":"Unauthorized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"unauthorized":{"value":{"errorType":"unauthorized","errorMessage":"Authentication required."}}}}}},"404":{"description":"Account or asset not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"Account or asset not found."}}}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"internal_error":{"value":{"errorType":"internal_server_error","errorMessage":"An internal server error occurred."}}}}}},"503":{"$ref":"#/components/responses/EndpointUnavailableError"}}}},"/v2/customers":{"post":{"summary":"Create a customer","description":"Create a new customer record. You can optionally request capabilities\nand submit verification requirements in the same request.\n\nThis endpoint supports creating a customer with:\n- Minimal data (customer type only)\n- Capability requests\n- KYC data submission\n- Combined request for capability and required info for verification\n","operationId":"createCustomer","x-audience":"public","x-required-permissions":{"permissions":["customers:write@entity"],"enforcement":"any"},"tags":["Customers"],"security":[{"apiKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCustomerRequest"},"examples":{"createWithCapabilities":{"summary":"Create customer with capability requests","value":{"type":"individual","individual":{"firstName":"Jane","lastName":"Doe","address":{"line1":"500 Main St","city":"Boston","state":"MA","postCode":"02108","countryCode":"US"}},"capabilities":{"custodyCrypto":{"requested":true},"transferCrypto":{"requested":true}}}},"createWithTosAcceptances":{"summary":"Create customer and record Terms of Service acceptance","value":{"type":"individual","individual":{"firstName":"Jane","lastName":"Doe","address":{"line1":"500 Main St","city":"Boston","state":"MA","postCode":"02108","countryCode":"US"}},"capabilities":{"custodyCrypto":{"requested":true},"transferCrypto":{"requested":true}},"tosAcceptances":[{"versionId":"us_individual_2026-05-29","language":"en","acceptedAt":"2026-04-10T12:00:00Z"}]}},"createWithTaxAttestations":{"summary":"Create customer and record a tax attestation","value":{"type":"individual","individual":{"firstName":"Jane","lastName":"Doe","address":{"line1":"500 Main St","city":"Boston","state":"MA","postCode":"02108","countryCode":"US"}},"capabilities":{"transferFiat":{"requested":true}},"taxAttestations":[{"form":"us_w9","isExemptBackupWithholding":true,"edeliveryConsent":true,"acceptedAt":"2026-04-17T20:00:00Z"}]}},"createMinimal":{"summary":"Create customer without capabilities","value":{"type":"individual","individual":{}}}}}}},"responses":{"201":{"description":"Customer created successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Customer"},"example":{"customerId":"customer_af2937b0-9846-4fe7-bfe9-ccc22d935114","type":"individual","individual":{},"capabilities":{"custodyCrypto":{"requested":true,"status":"pending"},"custodyFiat":{"requested":false,"status":"unrequested"},"custodyStablecoin":{"requested":false,"status":"unrequested"},"tradeCrypto":{"requested":false,"status":"unrequested"},"tradeStablecoin":{"requested":false,"status":"unrequested"},"transferCrypto":{"requested":true,"status":"pending"},"transferFiat":{"requested":false,"status":"unrequested"},"transferStablecoin":{"requested":false,"status":"unrequested"}},"requirements":{"firstName":{"status":"due","impact":["custodyCrypto","transferCrypto"]},"lastName":{"status":"due","impact":["custodyCrypto","transferCrypto"]},"ssnLast4":{"status":"due"}},"createdAt":"2026-01-10T14:25:00Z","updatedAt":"2026-01-10T14:25:00Z"}}}},"400":{"description":"Invalid request. `unsupported_tos_language` is returned when a\n`tosAcceptances[].language` is not published for the matching\n`versionId` (i.e. not listed under `Customer.requirements.tos.tosVersions[].languages`).\nOther validation failures return `invalid_request`. See\n`x-error-instructions` on `ErrorType` for remediation steps;\n`errorMessage` carries human-readable detail. Missing Terms of\nService acceptances are surfaced on `Customer.requirements.tos.tosVersions[]`\n(returned on success) rather than as an error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"summary":"Generic invalid request","value":{"errorType":"invalid_request","errorMessage":"Invalid customer creation request."}},"unsupported_tos_language":{"summary":"A `tosAcceptances[].language` is not in the matching version's `languages`","value":{"errorType":"unsupported_tos_language","errorMessage":"Terms of Service version 'us_individual_2026-05-29' is not published in language 'fr'. Supported languages: ['en']."}}}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"422":{"$ref":"#/components/responses/IdempotencyError"},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}},"get":{"summary":"List customers","description":"List all customers. The API will return all customers that the API Key has\npermissions to access. Results are not returned in any guaranteed order.\n","operationId":"listCustomers","x-audience":"public","x-required-permissions":{"permissions":["customers:read@entity"],"enforcement":"any"},"tags":["Customers"],"security":[{"apiKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/PageSize"},{"$ref":"#/components/parameters/PageToken"}],"responses":{"200":{"description":"Successfully listed customers.","content":{"application/json":{"schema":{"allOf":[{"type":"object","required":["customers"],"properties":{"customers":{"type":"array","description":"The list of customers.","items":{"$ref":"#/components/schemas/Customer"}}}},{"$ref":"#/components/schemas/ListResponse"}]},"example":{"customers":[{"customerId":"customer_af2937b0-9846-4fe7-bfe9-ccc22d935114","type":"individual","individual":{"firstName":"Jane","lastName":"Doe","email":"jane.doe@example.com"},"capabilities":{"custodyCrypto":{"requested":true,"status":"active"},"custodyFiat":{"requested":false,"status":"unrequested"},"custodyStablecoin":{"requested":false,"status":"unrequested"},"tradeCrypto":{"requested":true,"status":"pending"},"tradeStablecoin":{"requested":false,"status":"unrequested"},"transferCrypto":{"requested":true,"status":"active"},"transferFiat":{"requested":false,"status":"unrequested"},"transferStablecoin":{"requested":false,"status":"unrequested"}},"requirements":{"fullSsn":{"status":"rejected","impact":["tradeCrypto"]},"sourceOfFunds":{"status":"due"},"citizenship":{"status":"due"},"tos":{"status":"due","impact":["tradeCrypto","transferFiat"],"tosVersions":[{"versionId":"us_individual_2026-05-29","languages":["en"],"url":"https://docs.cdp.coinbase.com/legal/terms/us_individual_2026-05-29"}]}},"createdAt":"2026-01-10T14:25:00Z","updatedAt":"2026-01-10T14:30:00Z"}],"nextPageToken":"eyJsYXN0X2lkIjogImFiYzEyMyIsICJ0aW1lc3RhbXAiOiAxNzA3ODIzNzAxfQ=="}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"Invalid request. Please check the request body and parameters."}}}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/customers/{customerId}":{"get":{"summary":"Get a customer","description":"Get a customer by their ID. Returns the full customer object.\n","operationId":"getCustomerById","x-audience":"public","x-required-permissions":{"permissions":["customers:read@entity"],"enforcement":"any"},"tags":["Customers"],"security":[{"apiKeyAuth":[]}],"parameters":[{"name":"customerId","in":"path","required":true,"description":"The ID of the customer.","schema":{"$ref":"#/components/schemas/CustomerId"},"example":"customer_af2937b0-9846-4fe7-bfe9-ccc22d935114"}],"responses":{"200":{"description":"Successfully retrieved customer.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Customer"},"example":{"customerId":"customer_af2937b0-9846-4fe7-bfe9-ccc22d935114","type":"individual","individual":{"firstName":"Jane","lastName":"Doe","email":"jane.doe@example.com"},"capabilities":{"custodyCrypto":{"requested":true,"status":"active"},"custodyFiat":{"requested":false,"status":"unrequested"},"custodyStablecoin":{"requested":false,"status":"unrequested"},"tradeCrypto":{"requested":true,"status":"pending"},"tradeStablecoin":{"requested":false,"status":"unrequested"},"transferCrypto":{"requested":true,"status":"active"},"transferFiat":{"requested":false,"status":"unrequested"},"transferStablecoin":{"requested":false,"status":"unrequested"}},"requirements":{"fullSsn":{"status":"rejected","impact":["tradeCrypto"]},"sourceOfFunds":{"status":"due"},"citizenship":{"status":"due"},"tos":{"status":"due","impact":["tradeCrypto","transferFiat"],"tosVersions":[{"versionId":"us_individual_2026-05-29","languages":["en"],"url":"https://docs.cdp.coinbase.com/legal/terms/us_individual_2026-05-29"}]}},"createdAt":"2026-01-10T14:25:00Z","updatedAt":"2026-01-10T14:30:00Z"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"Invalid request. Please check the request body and parameters."}}}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"404":{"description":"Customer not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"Customer not found."}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}},"delete":{"summary":"Delete a customer","description":"Initiates deletion of the customer and all associated data. This operation\nis idempotent — repeated calls for an already-deleted customer return 204.\nA 404 is returned only when no customer with the given ID exists for the\ncaller's entity.\n","operationId":"deleteCustomerById","x-audience":"public","x-required-permissions":{"permissions":["customers:write@entity"],"enforcement":"any"},"tags":["Customers"],"security":[{"apiKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"},{"name":"customerId","in":"path","required":true,"description":"The ID of the customer.","schema":{"$ref":"#/components/schemas/CustomerId"},"example":"customer_af2937b0-9846-4fe7-bfe9-ccc22d935114"}],"responses":{"204":{"description":"Customer deletion initiated successfully."},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"Invalid request. Please check the request body and parameters."}}}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"404":{"description":"No customer with the given ID exists for the caller's entity.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"Customer not found."}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}},"put":{"summary":"Update a customer","description":"Update customer information and/or request capability changes.\nThis endpoint supports partial updates. Provide only the fields you wish to change.\n","operationId":"updateCustomerById","x-audience":"public","x-required-permissions":{"permissions":["customers:write@entity"],"enforcement":"any"},"tags":["Customers"],"security":[{"apiKeyAuth":[]}],"parameters":[{"name":"customerId","in":"path","required":true,"description":"The ID of the customer.","schema":{"$ref":"#/components/schemas/CustomerId"},"example":"customer_af2937b0-9846-4fe7-bfe9-ccc22d935114"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"description":"Customer fields to update. All fields are optional; omit a field to\nleave it unchanged.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCustomerRequest"},"examples":{"requestCapability":{"summary":"Request a capability","value":{"capabilities":{"custodyFiat":{"requested":true}}}},"submitRequirements":{"summary":"Submit verification requirements","value":{"individual":{"firstName":"Jane","lastName":"Doe","fullSsn":"123-45-6789","address":{"line1":"123 Main St","city":"New York","state":"NY","postCode":"10001","countryCode":"US"}},"tosAcceptances":[{"versionId":"us_individual_2026-05-29","language":"en","acceptedAt":"2026-04-10T12:00:00Z"}],"taxAttestations":[{"form":"us_w9","isExemptBackupWithholding":true,"edeliveryConsent":true,"acceptedAt":"2026-04-17T20:00:00Z"}]}},"requestWithRequirements":{"summary":"Request capability with verification requirements","value":{"capabilities":{"custodyFiat":{"requested":true}},"individual":{"firstName":"Jane","lastName":"Doe","dateOfBirth":{"day":"15","month":"01","year":"1990"}}}}}}}},"responses":{"200":{"description":"Successfully updated customer.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Customer"},"example":{"customerId":"customer_af2937b0-9846-4fe7-bfe9-ccc22d935114","type":"individual","individual":{},"capabilities":{"custodyCrypto":{"requested":true,"status":"active"},"custodyFiat":{"requested":true,"status":"pending"},"custodyStablecoin":{"requested":false,"status":"unrequested"},"tradeCrypto":{"requested":false,"status":"unrequested"},"tradeStablecoin":{"requested":false,"status":"unrequested"},"transferCrypto":{"requested":true,"status":"active"},"transferFiat":{"requested":false,"status":"unrequested"},"transferStablecoin":{"requested":false,"status":"unrequested"}},"requirements":{"dateOfBirth":{"status":"pending","impact":["custodyFiat"]},"sourceOfFunds":{"status":"due"}},"createdAt":"2026-01-10T14:25:00Z","updatedAt":"2026-01-10T14:25:00Z"}}}},"400":{"description":"Invalid request. `unsupported_tos_language` is returned when a\n`tosAcceptances[].language` is not published for the matching\n`versionId` (i.e. not listed under `Customer.requirements.tos.tosVersions[].languages`).\nOther validation failures return `invalid_request`. See\n`x-error-instructions` on `ErrorType` for remediation steps;\n`errorMessage` carries human-readable detail. Missing Terms of\nService acceptances are surfaced on `Customer.requirements.tos.tosVersions[]`\n(returned on success) rather than as an error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"summary":"Generic invalid request","value":{"errorType":"invalid_request","errorMessage":"Invalid request. Please check the request body and parameters."}},"unsupported_tos_language":{"summary":"A `tosAcceptances[].language` is not in the matching version's `languages`","value":{"errorType":"unsupported_tos_language","errorMessage":"Terms of Service version 'us_individual_2026-05-29' is not published in language 'fr'. Supported languages: ['en']."}}}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"description":"The customer cannot be modified at this time. This may occur when one or more capabilities are permanently inactive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"customer_not_modifiable":{"value":{"errorType":"forbidden","errorMessage":"This customer cannot be modified at this time."}}}}}},"404":{"description":"Customer not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"Customer not found."}}}}}},"422":{"$ref":"#/components/responses/IdempotencyError"},"429":{"$ref":"#/components/responses/RateLimitExceeded"},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/deposit-destinations":{"get":{"summary":"List deposit destinations","description":"List deposit destinations. You can optionally filter the results by type, account ID, network, or cryptocurrency address. Results are sorted by creation date in descending order (newest first).","operationId":"listDepositDestinations","x-audience":"public","x-required-permissions":{"permissions":["accounts:read@entity","accounts:read@project"],"enforcement":"any"},"tags":["Deposit Destinations"],"security":[{"apiKeyAuth":[]}],"parameters":[{"name":"accountId","in":"query","required":false,"description":"Filter deposit destinations by account ID.","schema":{"$ref":"#/components/schemas/AccountId"},"example":"account_af2937b0-9846-4fe7-bfe9-ccc22d935114"},{"name":"address","in":"query","required":false,"description":"Filter deposit destinations by the cryptocurrency address.","schema":{"type":"string","description":"The cryptocurrency address to filter by. Format depends on the network (e.g., 0x-prefixed for EVM networks, base58 for Solana)."},"example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"},{"name":"type","in":"query","required":false,"description":"Filter deposit destinations by type.","schema":{"$ref":"#/components/schemas/DepositDestinationType"},"example":"crypto"},{"name":"network","in":"query","required":false,"description":"Filter deposit destinations by network.","schema":{"type":"string","description":"The blockchain network to filter by (e.g., base, ethereum). Only applies to crypto deposit destinations."},"example":"base"},{"$ref":"#/components/parameters/PageSize"},{"$ref":"#/components/parameters/PageToken"}],"responses":{"200":{"description":"Successfully listed deposit destinations.","content":{"application/json":{"schema":{"allOf":[{"type":"object","required":["depositDestinations"],"properties":{"depositDestinations":{"type":"array","description":"The list of deposit destinations.","items":{"$ref":"#/components/schemas/DepositDestination"}}}},{"$ref":"#/components/schemas/ListResponse"}]},"examples":{"crypto":{"summary":"Crypto deposit destination","value":{"depositDestinations":[{"depositDestinationId":"depositDestination_af2937b0-9846-4fe7-bfe9-ccc22d935114","accountId":"account_af2937b0-9846-4fe7-bfe9-ccc22d935114","type":"crypto","network":"base","address":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","crypto":{"network":"base","address":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"},"target":{"accountId":"account_af2937b0-9846-4fe7-bfe9-ccc22d935114","asset":"usd"},"status":"active","metadata":{"customer_id":"123e4567-e89b-12d3-a456-426614174000","reference":"order-12345"},"createdAt":"2023-10-08T14:30:00Z","updatedAt":"2023-10-08T14:30:00Z"}]}}}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"Invalid query parameters."}}}}}},"401":{"description":"Unauthorized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"unauthorized":{"value":{"errorType":"unauthorized","errorMessage":"Authentication required."}}}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"internal_error":{"value":{"errorType":"internal_server_error","errorMessage":"An internal server error occurred."}}}}}}}},"post":{"summary":"Create deposit destination","description":"Create a new deposit destination for an account. A deposit destination is a cryptocurrency address that can be used to receive funds. The address will be generated for the specified network.\n\nFor Customer-owned accounts, the Customer must have the `custodyCrypto` and `custodyStablecoin` capabilities enabled, otherwise the request is rejected with `customer_not_authorized` (HTTP 403).","operationId":"createDepositDestination","x-audience":"public","x-required-permissions":{"permissions":["accounts:write@entity"],"enforcement":"any"},"tags":["Deposit Destinations"],"security":[{"apiKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDepositDestinationRequest"},"examples":{"crypto":{"summary":"Create a crypto deposit destination","value":{"accountId":"account_af2937b0-9846-4fe7-bfe9-ccc22d935114","type":"crypto","crypto":{"network":"base"},"target":{"accountId":"account_af2937b0-9846-4fe7-bfe9-ccc22d935114","asset":"usd"},"metadata":{"customer_id":"123e4567-e89b-12d3-a456-426614174000","reference":"order-12345"}}}}}}},"responses":{"201":{"description":"Successfully created deposit destination.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DepositDestination"},"examples":{"crypto":{"summary":"Crypto deposit destination","value":{"depositDestinationId":"depositDestination_af2937b0-9846-4fe7-bfe9-ccc22d935114","accountId":"account_af2937b0-9846-4fe7-bfe9-ccc22d935114","type":"crypto","network":"base","address":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","crypto":{"network":"base","address":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"},"target":{"accountId":"account_af2937b0-9846-4fe7-bfe9-ccc22d935114","asset":"usd"},"status":"active","metadata":{"customer_id":"123e4567-e89b-12d3-a456-426614174000","reference":"order-12345"},"createdAt":"2023-10-08T14:30:00Z","updatedAt":"2023-10-08T14:30:00Z"}}}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"Invalid network specified or missing required fields."}}}}}},"401":{"description":"Unauthorized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"unauthorized":{"value":{"errorType":"unauthorized","errorMessage":"Authentication required."}}}}}},"403":{"description":"Customer is not authorized for one or more capabilities required by this action.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"customer_not_authorized":{"summary":"Customer is not authorized for one or more required capabilities","value":{"errorType":"customer_not_authorized","errorMessage":"Customer is not authorized for one or more capabilities required by this action.","unauthorizedCapabilities":["custodyCrypto","custodyStablecoin"]}}}}}},"404":{"description":"Account not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"Account not found."}}}}}},"422":{"$ref":"#/components/responses/IdempotencyError"},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"internal_error":{"value":{"errorType":"internal_server_error","errorMessage":"An internal server error occurred."}}}}}},"503":{"$ref":"#/components/responses/EndpointUnavailableError"}}}},"/v2/deposit-destinations/{depositDestinationId}":{"get":{"summary":"Get deposit destination","description":"Get a specific deposit destination by its ID.","operationId":"getDepositDestinationById","x-audience":"public","x-required-permissions":{"permissions":["accounts:read@entity","accounts:read@project"],"enforcement":"any"},"tags":["Deposit Destinations"],"security":[{"apiKeyAuth":[]}],"parameters":[{"name":"depositDestinationId","in":"path","required":true,"description":"The ID of the deposit address to retrieve.","schema":{"$ref":"#/components/schemas/DepositDestinationId"},"example":"depositDestination_af2937b0-9846-4fe7-bfe9-ccc22d935114"}],"responses":{"200":{"description":"Successfully retrieved deposit destination.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DepositDestination"},"examples":{"crypto":{"summary":"Crypto deposit destination","value":{"depositDestinationId":"depositDestination_af2937b0-9846-4fe7-bfe9-ccc22d935114","accountId":"account_af2937b0-9846-4fe7-bfe9-ccc22d935114","type":"crypto","network":"base","address":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","crypto":{"network":"base","address":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"},"target":{"accountId":"account_af2937b0-9846-4fe7-bfe9-ccc22d935114","asset":"usd"},"status":"active","metadata":{"customer_id":"123e4567-e89b-12d3-a456-426614174000","reference":"order-12345"},"createdAt":"2023-10-08T14:30:00Z","updatedAt":"2023-10-08T14:30:00Z"}}}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"Invalid deposit address ID."}}}}}},"401":{"description":"Unauthorized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"unauthorized":{"value":{"errorType":"unauthorized","errorMessage":"Authentication required."}}}}}},"404":{"description":"Deposit address not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"Deposit address not found."}}}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"internal_error":{"value":{"errorType":"internal_server_error","errorMessage":"An internal server error occurred."}}}}}}}}},"/v2/transfers":{"post":{"summary":"Create transfer","description":"Create a new transfer to move funds from a source to a target.\nAll transfers first transition to `quoted`. If `execute: false`, the transfer stays quoted until you call `/v2/transfers/{transferId}/execute`.\nIf `execute: true`, quoted status emits momentarily before the transfer moves to `processing`, where execution proceeds. Subscribe to the transfers webhook to  follow progress in real time instead of polling.","operationId":"createTransfer","x-audience":"public","x-required-permissions":{"permissions":["transfers:write@entity"],"enforcement":"any"},"tags":["Transfers"],"security":[{"apiKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransferRequest"},"example":{"source":{"accountId":"account_af2937b0-9846-4fe7-bfe9-ccc22d935114","asset":"usd"},"target":{"address":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"base","asset":"usdc"},"amount":"100.00","asset":"usd","execute":false,"validateOnly":false,"metadata":{"invoiceId":"12345","reference":"Payment for invoice #12345"},"travelRule":{"isSelf":false,"isIntermediary":true,"originator":{"name":"John Doe","address":{"line1":"123 Main St","line2":"Unit 201","city":"San Francisco","state":"California","postCode":"94105","countryCode":"US"},"financialInstitution":"PayPal, Inc.","vaspName":"Fidelity Digital Asset Services, LLC","vaspAddress":{"line1":"123 Market St","line2":"Suite 400","city":"San Francisco","state":"California","postCode":"94105","countryCode":"US"},"vaspIdentifier":"5493001KJTIIGC8Y1R17","personalId":"123-45-6789","dateOfBirth":{"day":"15","month":"08","year":"1990"}},"beneficiary":{"name":"Jane Smith","address":{"line1":"456 Oak Ave","city":"Paris","postCode":"75001","countryCode":"FR"},"walletType":"custodial"}}}}}},"responses":{"200":{"description":"Successfully created transfer.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Transfer"},"examples":{"regular":{"$ref":"#/components/examples/RegularTransferQuoted"},"fx_quoted":{"$ref":"#/components/examples/FxTransferQuoted"}}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"Invalid query parameters."}}}}}},"403":{"description":"Customer is not authorized for one or more capabilities required by this action.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"customer_not_authorized":{"summary":"Customer is not authorized for one or more required capabilities","value":{"errorType":"customer_not_authorized","errorMessage":"Customer is not authorized for one or more capabilities required by this action.","unauthorizedCapabilities":["transferStablecoin","tradeStablecoin","tradeCrypto","custodyStablecoin"]}}}}}},"422":{"$ref":"#/components/responses/IdempotencyError"}}},"get":{"summary":"List transfers","description":"List transfers for your organization. Use this to view and monitor your transfer activity.\n\n**Status Filtering**: Filter by specific status to efficiently manage transfers:\n* `?status=processing` - Monitor active transfers.\n* `?status=quoted` - Find transfers awaiting execution.\n* `?status=failed` - Review failed transfers for troubleshooting.\n* `?status=completed` - Find completed transfers.\n\n**Account Filtering**: Filter by account ID to find transfers involving a specific account:\n* `?accountId=<ID>` - All transfers where the account is either source or target (OR semantics).\n* `?sourceAccountId=<ID>` - Only transfers where the account is the source (outbound).\n* `?targetAccountId=<ID>` - Only transfers where the account is the target (inbound).\nProviding `accountId` together with `sourceAccountId` or `targetAccountId` is a validation error and returns HTTP 400.\n\n**Date Range Filtering**: Filter by creation or last-updated time for reconciliation:\n* `?createdAfter=2026-01-01T00:00:00Z&createdBefore=2026-01-31T23:59:59Z` - Transfers created within a date range.\n* `?updatedAfter=2026-01-01T00:00:00Z` - Transfers updated since a given time. Useful for incremental sync.\n\n**Asset Filtering**: Filter by source or target asset symbol:\n* `?sourceAsset=usd` - Transfers funded from a USD account.\n* `?targetAsset=usdc` - Transfers delivering USDC to the target.\n\n**Other Filters**:\n* `?sourceAddress=0x...` - Transfers from a specific on-chain source address.\n* `?targetAddress=0x...` - Transfers to a specific on-chain destination address.\n* `?targetEmail=user@example.com` - Transfers to a specific email recipient.\n* `?transferId=transfer_...` - Look up a single transfer by ID; bypasses pagination.","operationId":"listTransfers","x-audience":"public","x-required-permissions":{"permissions":["transfers:read@entity","transfers:read@project"],"enforcement":"any"},"tags":["Transfers"],"security":[{"apiKeyAuth":[]}],"parameters":[{"name":"status","in":"query","required":false,"description":"Filter transfers by status. Useful for building dashboards, monitoring active transfers, or finding transfers needing action.","example":"quoted","schema":{"$ref":"#/components/schemas/TransferStatus"}},{"name":"accountId","in":"query","required":false,"description":"Filter transfers by account ID. Returns transfers where the specified account is either the source or target (OR semantics). Cannot be combined with `sourceAccountId` or `targetAccountId`.","schema":{"$ref":"#/components/schemas/AccountId"},"example":"account_af2937b0-9846-4fe7-bfe9-ccc22d935114"},{"name":"sourceAccountId","in":"query","required":false,"description":"Filter transfers by source account ID. Returns only transfers where the specified account is the source. Cannot be combined with `accountId`.","schema":{"$ref":"#/components/schemas/AccountId"},"example":"account_af2937b0-9846-4fe7-bfe9-ccc22d935114"},{"name":"targetAccountId","in":"query","required":false,"description":"Filter transfers by target account ID. Returns only transfers where the specified account is the target. Cannot be combined with `accountId`.","schema":{"$ref":"#/components/schemas/AccountId"},"example":"account_af2937b0-9846-4fe7-bfe9-ccc22d935114"},{"name":"createdAfter","in":"query","required":false,"description":"Filter transfers to those created at or after this datetime (inclusive). ISO 8601 format.","example":"2026-01-01T00:00:00Z","schema":{"type":"string","format":"date-time"}},{"name":"createdBefore","in":"query","required":false,"description":"Filter transfers to those created at or before this datetime (inclusive). ISO 8601 format.","example":"2026-01-31T23:59:59Z","schema":{"type":"string","format":"date-time"}},{"name":"updatedAfter","in":"query","required":false,"description":"Filter transfers to those updated at or after this datetime (inclusive). ISO 8601 format. Useful for incremental sync — poll for transfers that changed state since your last check.","example":"2026-01-01T00:00:00Z","schema":{"type":"string","format":"date-time"}},{"name":"updatedBefore","in":"query","required":false,"description":"Filter transfers to those updated at or before this datetime (inclusive). ISO 8601 format.","example":"2026-01-31T23:59:59Z","schema":{"type":"string","format":"date-time"}},{"name":"sourceAsset","in":"query","required":false,"description":"Filter transfers by source asset symbol (e.g., `usd`, `usdc`).","example":"usd","schema":{"type":"string"}},{"name":"targetAsset","in":"query","required":false,"description":"Filter transfers by target asset symbol (e.g., `usdc`, `eth`).","example":"usdc","schema":{"type":"string"}},{"name":"sourceAddress","in":"query","required":false,"description":"Filter transfers by the on-chain address of the source.","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","schema":{"$ref":"#/components/schemas/BlockchainAddress"}},{"name":"targetAddress","in":"query","required":false,"description":"Filter transfers by the on-chain destination address of the target.","example":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","schema":{"$ref":"#/components/schemas/BlockchainAddress"}},{"name":"targetEmail","in":"query","required":false,"description":"Filter transfers by the email address of the target recipient.","example":"recipient@example.com","schema":{"$ref":"#/components/schemas/Email"}},{"name":"transferId","in":"query","required":false,"description":"Filter to a specific transfer by ID. When provided, returns only the matching transfer and bypasses pagination.","example":"transfer_af2937b0-9846-4fe7-bfe9-ccc22d935114","schema":{"type":"string","pattern":"^transfer_[a-f0-9\\-]{36}$"}},{"$ref":"#/components/parameters/PageSize"},{"$ref":"#/components/parameters/PageToken"}],"responses":{"200":{"description":"Successfully listed transfers.","content":{"application/json":{"schema":{"allOf":[{"type":"object","required":["transfers"],"properties":{"transfers":{"type":"array","description":"The list of transfers.","items":{"$ref":"#/components/schemas/Transfer"}}}},{"$ref":"#/components/schemas/ListResponse"}]},"examples":{"page":{"$ref":"#/components/examples/ListTransfersResponse"}}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"Invalid query parameters."}}}}}}}}},"/v2/transfers/{transferId}":{"get":{"summary":"Get transfer","description":"Get a transfer by its ID.","operationId":"getTransferById","x-audience":"public","x-required-permissions":{"permissions":["transfers:read@entity","transfers:read@project"],"enforcement":"any"},"tags":["Transfers"],"security":[{"apiKeyAuth":[]}],"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."}}}}}}}}},"/v2/transfers/{transferId}/execute":{"post":{"x-audience":"public","x-required-permissions":{"permissions":["transfers:write@entity"],"enforcement":"any"},"summary":"Execute transfer","description":"Executes a transfer which was created using the Create a transfer endpoint.","operationId":"executeFundTransfer","tags":["Transfers"],"security":[{"apiKeyAuth":[]}],"parameters":[{"name":"transferId","description":"The ID of the transfer.","in":"path","required":true,"schema":{"type":"string","pattern":"^transfer_[a-f0-9\\-]{36}$"},"example":"transfer_af2937b0-9846-4fe7-bfe9-ccc22d935114"},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"description":"Successfully committed a transfer.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Transfer"},"example":{"transferId":"transfer_af2937b0-9846-4fe7-bfe9-ccc22d935114","status":"processing","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"}],"executedAt":"2023-10-08T14:31:00Z","createdAt":"2023-10-08T14:30:00Z","updatedAt":"2023-10-08T14:31:00Z","metadata":{"invoiceId":"12345","reference":"Payment for invoice #12345"}}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"Invalid transfer ID."}}}}}},"401":{"description":"Unauthorized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"unauthorized":{"value":{"errorType":"unauthorized","errorMessage":"Authentication error."}}}}}},"403":{"description":"Customer is not authorized for one or more capabilities required by this action.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"customer_not_authorized":{"summary":"Customer is not authorized for one or more required capabilities","value":{"errorType":"customer_not_authorized","errorMessage":"Customer is not authorized for one or more capabilities required by this action.","unauthorizedCapabilities":["transferStablecoin"]}}}}}},"404":{"description":"Transfer not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"Transfer with the given ID does not exist."}}}}}},"422":{"$ref":"#/components/responses/IdempotencyError"},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"rate_limit_exceeded":{"value":{"errorType":"rate_limit_exceeded","errorMessage":"Rate limit exceeded."}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/transfers/{transferId}/travel-rule":{"post":{"summary":"Submit deposit travel rule information","description":"Submit travel rule information for a deposit transfer held pending compliance review.\n\nRequired fields vary by jurisdiction and may include originator name, address, date of birth, personal ID, and VASP information.\n\nIf the submitted information satisfies all jurisdictional requirements, `status` will be `completed` and the transfer will proceed. Otherwise, `status` will be `incomplete` and `missingFields` will indicate which fields still need to be provided.","operationId":"submitDepositTravelRule","x-audience":"public","x-required-permissions":{"permissions":["transfers:write@entity"],"enforcement":"any"},"tags":["Transfers"],"security":[{"apiKeyAuth":[]}],"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"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DepositTravelRuleRequest"},"example":{"originator":{"name":"John Doe","address":{"line1":"123 Main St","city":"San Francisco","state":"CA","postCode":"94105","countryCode":"US"}},"beneficiary":{"name":"Jane Smith"},"isSelf":false}}}},"responses":{"200":{"description":"Successfully submitted travel rule information.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DepositTravelRuleResponse"},"examples":{"incomplete":{"value":{"status":"incomplete","missingFields":["originator.dateOfBirth"]}},"completed":{"value":{"status":"completed","missingFields":[]}}}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"Invalid request body."}}}}}},"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."}}}}}},"422":{"$ref":"#/components/responses/IdempotencyError"}}}},"/v2/end-users":{"post":{"summary":"Create end user","description":"Creates an end user. An end user is an entity that can own CDP EVM accounts, EVM smart accounts, and/or Solana accounts. 1 or more authentication methods must be associated with an end user. By default, no accounts are created unless the optional `evmAccount` and/or `solanaAccount` fields are provided.\nThis API is intended to be used by the developer's own backend, and is authenticated using the developer's CDP API key.","operationId":"createEndUser","tags":["End User Account Management"],"x-audience":"public","security":[{"apiKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/XWalletAuth"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"userId":{"description":"A stable, unique identifier for the end user. The `userId` must be unique across all end users in the developer's CDP Project. It must be between 1 and 100 characters long and can only contain alphanumeric characters and hyphens.\n\nIf `userId` is not provided in the request, the server will generate a random UUID.","type":"string","pattern":"^[a-zA-Z0-9-]{1,100}$","example":"e051beeb-7163-4527-a5b6-35e301529ff2"},"authenticationMethods":{"$ref":"#/components/schemas/AuthenticationMethods"},"evmAccount":{"type":"object","description":"Configuration for creating an EVM account for the end user.","properties":{"createSmartAccount":{"type":"boolean","description":"If true, creates an EVM smart account and a default EVM EOA account as the owner. If false, only a EVM EOA account is created.","default":false,"example":true},"enableSpendPermissions":{"type":"boolean","description":"If true, enables spend permissions for the EVM smart account.","example":true}}},"solanaAccount":{"type":"object","description":"Configuration for creating a Solana account for the end user.","properties":{"createSmartAccount":{"type":"boolean","description":"Only false is a valid option since currently smart accounts on Solana are not supported.","default":false,"example":false}}}},"required":["authenticationMethods"]},"examples":{"default_behavior":{"summary":"Default (no accounts created)","value":{"authenticationMethods":[{"type":"email","email":"user@example.com"}]}},"evm_only":{"summary":"EVM account only","value":{"authenticationMethods":[{"type":"email","email":"user@example.com"}],"evmAccount":{}}},"evm_with_smart_account":{"summary":"EVM only with smart account","value":{"authenticationMethods":[{"type":"email","email":"user@example.com"}],"evmAccount":{"createSmartAccount":true}}},"solana_only":{"summary":"Solana account only","value":{"authenticationMethods":[{"type":"sms","phoneNumber":"+15555551234"}],"solanaAccount":{"createSmartAccount":false}}},"evm_and_solana":{"summary":"Both EVM and Solana accounts","value":{"authenticationMethods":[{"type":"sms","phoneNumber":"+15555551234"}],"evmAccount":{"createSmartAccount":true},"solanaAccount":{"createSmartAccount":false}}}}}}},"responses":{"201":{"description":"Successfully created end user.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndUser"},"examples":{"default_no_accounts":{"summary":"Default behavior - No accounts created","value":{"userId":"user-001","authenticationMethods":[{"type":"email","email":"user@example.com"}],"evmAccounts":[],"evmAccountObjects":[],"evmSmartAccounts":[],"evmSmartAccountObjects":[],"solanaAccounts":[],"solanaAccountObjects":[],"createdAt":"2025-11-17T10:00:00Z"}},"evm_smart_account_only":{"summary":"EVM smart account only","value":{"userId":"user-003","authenticationMethods":[{"type":"email","email":"user@example.com"}],"evmAccounts":["0x742d35Cc6634C0532925a3b844Bc454e4438f44e"],"evmAccountObjects":[{"address":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","createdAt":"2025-11-17T10:00:00Z"}],"evmSmartAccounts":["0x842d35Cc6634C0532925a3b844Bc454e4438f55f"],"evmSmartAccountObjects":[{"address":"0x842d35Cc6634C0532925a3b844Bc454e4438f55f","ownerAddresses":["0x742d35Cc6634C0532925a3b844Bc454e4438f44e"],"createdAt":"2025-11-17T10:00:00Z"}],"solanaAccounts":[],"solanaAccountObjects":[],"createdAt":"2025-11-17T10:00:00Z"}},"solana_only":{"summary":"Solana account only","value":{"userId":"user-004","authenticationMethods":[{"type":"sms","phoneNumber":"+15555551234"}],"evmAccounts":[],"evmAccountObjects":[],"evmSmartAccounts":[],"evmSmartAccountObjects":[],"solanaAccounts":["HpabPRRCFbBKSuJr5PdkVvQc85FyxyTWkFM2obBRSvHT"],"solanaAccountObjects":[{"address":"HpabPRRCFbBKSuJr5PdkVvQc85FyxyTWkFM2obBRSvHT","createdAt":"2025-11-17T10:00:00Z"}],"createdAt":"2025-11-17T10:00:00Z"}},"evm_no_smart_account":{"summary":"EVM without smart account","value":{"userId":"user-004","authenticationMethods":[{"type":"email","email":"user@example.com"}],"evmAccounts":["0x742d35Cc6634C0532925a3b844Bc454e4438f44e"],"evmAccountObjects":[{"address":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","createdAt":"2025-11-17T10:00:00Z"}],"evmSmartAccounts":[],"evmSmartAccountObjects":[],"solanaAccounts":[],"solanaAccountObjects":[],"createdAt":"2025-11-17T10:00:00Z"}},"multiple_accounts":{"summary":"End user with multiple accounts created","value":{"userId":"user-005","authenticationMethods":[{"type":"email","email":"user@example.com"}],"evmAccounts":["0x742d35Cc6634C0532925a3b844Bc454e4438f44e","0x8F2A9B5C3D4E6F7A8B9C0D1E2F3A4B5C6D7E8F9A","0xA1B2C3D4E5F6A7B8C9D0E1F2A3B4C5D6E7F8A9B0"],"evmAccountObjects":[{"address":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","createdAt":"2025-11-17T10:00:00Z"},{"address":"0x8F2A9B5C3D4E6F7A8B9C0D1E2F3A4B5C6D7E8F9A","createdAt":"2025-11-17T10:05:00Z"},{"address":"0xA1B2C3D4E5F6A7B8C9D0E1F2A3B4C5D6E7F8A9B0","createdAt":"2025-11-17T10:10:00Z"}],"evmSmartAccounts":["0x842d35Cc6634C0532925a3b844Bc454e4438f55f","0x9D3E4F5A6B7C8D9E0F1A2B3C4D5E6F7A8B9C0D1E"],"evmSmartAccountObjects":[{"address":"0x842d35Cc6634C0532925a3b844Bc454e4438f55f","ownerAddresses":["0x742d35Cc6634C0532925a3b844Bc454e4438f44e"],"createdAt":"2025-11-17T10:02:00Z"},{"address":"0x9D3E4F5A6B7C8D9E0F1A2B3C4D5E6F7A8B9C0D1E","ownerAddresses":["0x8F2A9B5C3D4E6F7A8B9C0D1E2F3A4B5C6D7E8F9A"],"createdAt":"2025-11-17T10:07:00Z"}],"solanaAccounts":["HpabPRRCFbBKSuJr5PdkVvQc85FyxyTWkFM2obBRSvHT","9ZN8wT6gKxLmJvP4rQnYt7VxKwL3mN9rT8Qx2WzJpK5s"],"solanaAccountObjects":[{"address":"HpabPRRCFbBKSuJr5PdkVvQc85FyxyTWkFM2obBRSvHT","createdAt":"2025-11-17T10:15:00Z"},{"address":"9ZN8wT6gKxLmJvP4rQnYt7VxKwL3mN9rT8Qx2WzJpK5s","createdAt":"2025-11-17T10:20:00Z"}],"createdAt":"2025-11-17T10:00:00Z"}}}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"At least one authentication method must be provided."}},"solana_smart_account_not_supported":{"value":{"errorType":"invalid_request","errorMessage":"The request contains one or more unsupported options."}}}}}},"401":{"description":"Unauthorized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"unauthorized":{"value":{"errorType":"unauthorized","errorMessage":"Wallet authentication error."}}}}}},"402":{"$ref":"#/components/responses/PaymentMethodRequiredError"},"422":{"$ref":"#/components/responses/IdempotencyError"},"500":{"$ref":"#/components/responses/InternalServerError"}}},"get":{"x-audience":"public","summary":"List end users","description":"Lists the end users belonging to the developer's CDP Project.\nBy default, the response is sorted by creation date in ascending order and paginated to 20 users per page.","operationId":"listEndUsers","tags":["End User Account Management"],"security":[{"apiKeyAuth":[]}],"parameters":[{"name":"pageSize","description":"The number of end users to return per page.","in":"query","required":false,"schema":{"type":"integer","default":20,"minimum":1,"maximum":100},"example":10},{"name":"pageToken","description":"The token for the desired page of end users. Will be empty if there are no more end users to fetch.","in":"query","required":false,"schema":{"type":"string"},"example":"eyJsYXN0X2lkIjogImFiYzEyMyIsICJ0aW1lc3RhbXAiOiAxNzA3ODIzNzAxfQ=="},{"name":"sort","description":"Sort end users. Defaults to ascending order (oldest first).","in":"query","required":false,"schema":{"type":"array","items":{"type":"string","enum":["createdAt=asc","createdAt=desc"]}},"example":["createdAt=asc"],"style":"form","explode":false}],"responses":{"200":{"description":"Successfully retrieved end users.","content":{"application/json":{"schema":{"allOf":[{"type":"object","required":["endUsers"],"properties":{"endUsers":{"type":"array","description":"The list of end users.","items":{"$ref":"#/components/schemas/EndUser"}}}},{"$ref":"#/components/schemas/ListResponse"}]}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"Invalid project ID."}}}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/end-users/auth/validate-token":{"post":{"x-audience":"public","summary":"Validate end user access token","description":"Validates the end user's access token and returns the end user's information. Returns an error if the access token is invalid or expired.\n\nThis API is intended to be used by the developer's own backend, and is authenticated using the developer's CDP API key.","operationId":"validateEndUserAccessToken","tags":["End User Account Management"],"security":[{"apiKeyAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"The request body for a developer to verify an end user's access token.","properties":{"accessToken":{"type":"string","description":"The access token in JWT format to verify.","example":"eyJhbGciOiJFUzI1NiIsImtpZCI6IjA1ZGNmYTU1LWY1NzktNDg5YS1iNThhLTFlMDI5Nzk0N2VlNiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJjZHAtYXBpIiwiYXV0aF90eXBlIjoiZW1haWwiLCJleHAiOjE3NTM5ODAyOTksImlhdCI6MTc1Mzk3ODQ5OSwiaXNzIjoiY2RwLWFwaSIsImp0aSI6IjA3ZWY5M2JlLTYzMDQtNGQ1YS05NmE3LWJlMGI5MWI0ZTE3NCIsInByb2plY3RfaWQiOiJjNzRkOGI4OC0wOTNiLTQyZDItOGE4Yy1kZGM1YzVlMGViNDMiLCJzdWIiOiJjYTM4YTM4ZC0xNmE5LTRkMjYtYTcxZC0zOWY2NmY5YzZiN2UifQ.1SU0pOy-WR002qUw4hd_UmZWRSLz-ZL6v7PvQvZMKVE6a51x_tqeUeRGaTGuYl1whg0eccMObmK7FqXKRH6E4g"}},"required":["accessToken"]}}}},"responses":{"200":{"description":"Confirms that the access token is valid and returns the end user's information.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndUser"}}}},"400":{"description":"Request body is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"Missing access token."}}}}}},"401":{"description":"Request is not properly authenticated, or the access token is invalid or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"unauthorized":{"value":{"errorType":"unauthorized","errorMessage":"Invalid JWT issuer: not-cdp-api, expected: cdp-api."}}}}}},"404":{"description":"End user not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"End user not found."}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/end-users/{userId}":{"get":{"x-audience":"public","summary":"Get end user","description":"Gets an end user by ID.\n\nThis API is intended to be used by the developer's own backend, and is authenticated using the developer's CDP API key.","operationId":"getEndUser","tags":["End User Account Management"],"security":[{"apiKeyAuth":[]}],"parameters":[{"name":"userId","in":"path","required":true,"description":"The ID of the end user to get.","schema":{"type":"string","pattern":"^[a-zA-Z0-9-]{1,100}$"},"example":"e051beeb-7163-4527-a5b6-35e301529ff2"}],"responses":{"200":{"description":"Successfully got end user.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndUser"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"End user with the given ID not found."}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/end-users/lookup":{"get":{"x-audience":"public","summary":"Look up end users by identity","description":"Looks up end users. Exactly one lookup type must be provided per request:\n\n- **email**: searches across all email-based authentication methods\n  (email, Google, Apple, GitHub). May return multiple end users if the\n  same email address appears across different auth methods.\n\n- **oauthProvider + oauthSubject**: looks up a user by their OAuth\n  provider and subject (the `sub` claim from the provider's ID token).\n  Both params must be provided together.\n\n- **phoneNumber**: looks up a user by their SMS-verified phone number.\n- **siweAddress**: looks up a user by the Ethereum address they authenticated\n  with via Sign In With Ethereum (EIP-4361).\n\n\nReturns all matching end users. If no end users match, an empty array is returned.\n\nThis API is intended to be used by the developer's own backend, and is authenticated using the developer's CDP API key.","operationId":"lookupEndUser","tags":["End User Account Management"],"security":[{"apiKeyAuth":[]}],"parameters":[{"name":"email","in":"query","required":false,"description":"The email address to search for across all email-based authentication methods.","schema":{"$ref":"#/components/schemas/Email"},"example":"user@example.com"},{"name":"oauthProvider","in":"query","required":false,"description":"The OAuth provider to search by. Must be provided together with oauthSubject.","schema":{"$ref":"#/components/schemas/OAuth2ProviderType"},"example":"google"},{"name":"oauthSubject","in":"query","required":false,"description":"The OAuth subject (the `sub` claim from the provider's ID token). Must be provided together with oauthProvider.","schema":{"type":"string"},"example":"1234567890"},{"name":"phoneNumber","in":"query","required":false,"description":"The E.164-formatted phone number to search for. Must be URL-encoded when passed as a query parameter (e.g. `+14155552671` → `%2B14155552671`).","schema":{"$ref":"#/components/schemas/PhoneNumber"},"example":"+14155552671"},{"name":"siweAddress","in":"query","required":false,"description":"The ERC-55 checksummed Ethereum address to search for. Looks up a user by the address they authenticated with via Sign In With Ethereum (EIP-4361).","schema":{"$ref":"#/components/schemas/BlockchainAddress"},"example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"}],"responses":{"200":{"description":"Successfully looked up end users.","content":{"application/json":{"schema":{"type":"object","required":["endUsers"],"properties":{"endUsers":{"type":"array","description":"The list of end users matching the lookup.","items":{"$ref":"#/components/schemas/EndUser"}}}},"examples":{"email_match":{"summary":"End user found by email","value":{"endUsers":[{"userId":"user-001","authenticationMethods":[{"type":"email","email":"user@example.com"}],"evmAccounts":[],"evmAccountObjects":[],"evmSmartAccounts":[],"evmSmartAccountObjects":[],"solanaAccounts":[],"solanaAccountObjects":[],"createdAt":"2025-11-17T10:00:00Z"}]}},"multiple_email_matches":{"summary":"Multiple end users with same email across auth methods","value":{"endUsers":[{"userId":"user-001","authenticationMethods":[{"type":"email","email":"user@example.com"}],"evmAccounts":[],"evmAccountObjects":[],"evmSmartAccounts":[],"evmSmartAccountObjects":[],"solanaAccounts":[],"solanaAccountObjects":[],"createdAt":"2025-11-17T10:00:00Z"},{"userId":"user-002","authenticationMethods":[{"type":"google","sub":"google-sub-123","email":"user@example.com"}],"evmAccounts":[],"evmAccountObjects":[],"evmSmartAccounts":[],"evmSmartAccountObjects":[],"solanaAccounts":[],"solanaAccountObjects":[],"createdAt":"2025-11-17T11:00:00Z"}]}},"oauth_match":{"summary":"End user found by OAuth subject","value":{"endUsers":[{"userId":"user-003","authenticationMethods":[{"type":"google","sub":"1234567890","email":"user@example.com"}],"evmAccounts":[],"evmAccountObjects":[],"evmSmartAccounts":[],"evmSmartAccountObjects":[],"solanaAccounts":[],"solanaAccountObjects":[],"createdAt":"2025-11-17T12:00:00Z"}]}},"phone_match":{"summary":"End user found by phone number","value":{"endUsers":[{"userId":"user-004","authenticationMethods":[{"type":"sms","phoneNumber":"+14155552671"}],"evmAccounts":[],"evmAccountObjects":[],"evmSmartAccounts":[],"evmSmartAccountObjects":[],"solanaAccounts":[],"solanaAccountObjects":[],"createdAt":"2025-11-17T13:00:00Z"}]}},"siwe_match":{"summary":"End user found by SIWE address","value":{"endUsers":[{"userId":"user-005","authenticationMethods":[{"type":"siwe","address":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"}],"evmAccounts":[],"evmAccountObjects":[],"evmSmartAccounts":[],"evmSmartAccountObjects":[],"solanaAccounts":[],"solanaAccountObjects":[],"createdAt":"2025-11-17T14:00:00Z"}]}},"no_matches":{"summary":"No end users found","value":{"endUsers":[]}}}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"no_lookup_param":{"summary":"No lookup parameter provided","value":{"errorType":"invalid_request","errorMessage":"Exactly one lookup type must be provided: email, phoneNumber, siweAddress, or oauthProvider+oauthSubject."}},"multiple_lookup_params":{"summary":"Multiple lookup parameters provided","value":{"errorType":"invalid_request","errorMessage":"Exactly one lookup type must be provided: email, phoneNumber, siweAddress, or oauthProvider+oauthSubject."}},"oauth_missing_subject":{"summary":"oauthProvider provided without oauthSubject","value":{"errorType":"invalid_request","errorMessage":"oauthProvider and oauthSubject must be provided together."}}}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/end-users/{userId}/evm":{"post":{"summary":"Add EVM account to end user","description":"Adds a new EVM EOA account to an existing end user. End users can have up to 10 EVM accounts.\nThis API is intended to be used by the developer's own backend, and is authenticated using the developer's CDP API key.","operationId":"addEndUserEvmAccount","tags":["End User Account Management"],"x-audience":"public","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"userId","in":"path","required":true,"description":"The ID of the end user to add the account to.","schema":{"type":"string","pattern":"^[a-zA-Z0-9-]{1,100}$"},"example":"e051beeb-7163-4527-a5b6-35e301529ff2"},{"$ref":"#/components/parameters/XWalletAuth"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"},"examples":{"default":{"summary":"Create EVM EOA account","value":{}}}}}},"responses":{"201":{"description":"Successfully added EVM account to end user.","content":{"application/json":{"schema":{"type":"object","required":["evmAccount"],"properties":{"evmAccount":{"$ref":"#/components/schemas/EndUserEvmAccount"}}},"examples":{"default":{"summary":"EVM EOA account created","value":{"evmAccount":{"address":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","createdAt":"2025-11-17T10:00:00Z"}}}}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"max_accounts_reached":{"value":{"errorType":"invalid_request","errorMessage":"Maximum number of EVM accounts (10) reached for this end user."}}}}}},"401":{"description":"Unauthorized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"unauthorized":{"value":{"errorType":"unauthorized","errorMessage":"Wallet authentication error."}}}}}},"402":{"$ref":"#/components/responses/PaymentMethodRequiredError"},"404":{"description":"End user not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"End user with the given ID not found."}}}}}},"422":{"$ref":"#/components/responses/IdempotencyError"},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/end-users/{userId}/evm-smart-account":{"post":{"summary":"Add EVM smart account to end user","description":"Creates an EVM smart account for an existing end user. The backend will create a new EVM EOA account to serve as the owner of the smart account.\nThis API is intended to be used by the developer's own backend, and is authenticated using the developer's CDP API key.","operationId":"addEndUserEvmSmartAccount","tags":["End User Account Management"],"x-audience":"public","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"userId","in":"path","required":true,"description":"The ID of the end user to add the smart account to.","schema":{"type":"string","pattern":"^[a-zA-Z0-9-]{1,100}$"},"example":"e051beeb-7163-4527-a5b6-35e301529ff2"},{"$ref":"#/components/parameters/XWalletAuth"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"enableSpendPermissions":{"type":"boolean","description":"If true, enables spend permissions for the EVM smart account.","default":false,"example":true}}},"examples":{"default":{"summary":"Create smart account","value":{}},"with_spend_permissions":{"summary":"Create smart account with spend permissions","value":{"enableSpendPermissions":true}}}}}},"responses":{"201":{"description":"Successfully added EVM smart account to end user.","content":{"application/json":{"schema":{"type":"object","required":["evmSmartAccount"],"properties":{"evmSmartAccount":{"$ref":"#/components/schemas/EndUserEvmSmartAccount"}}},"examples":{"default":{"summary":"EVM smart account created","value":{"evmSmartAccount":{"address":"0x842d35Cc6634C0532925a3b844Bc454e4438f55f","ownerAddresses":["0x742d35Cc6634C0532925a3b844Bc454e4438f44e"],"createdAt":"2025-11-17T10:00:00Z"}}}}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"max_accounts_reached":{"value":{"errorType":"invalid_request","errorMessage":"Maximum number of EVM smart accounts (10) reached for this end user."}}}}}},"401":{"description":"Unauthorized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"unauthorized":{"value":{"errorType":"unauthorized","errorMessage":"Wallet authentication error."}}}}}},"402":{"$ref":"#/components/responses/PaymentMethodRequiredError"},"404":{"description":"End user not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"End user with the given ID not found."}}}}}},"422":{"$ref":"#/components/responses/IdempotencyError"},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/end-users/{userId}/solana":{"post":{"summary":"Add Solana account to end user","description":"Adds a new Solana account to an existing end user. End users can have up to 10 Solana accounts.\nThis API is intended to be used by the developer's own backend, and is authenticated using the developer's CDP API key.","operationId":"addEndUserSolanaAccount","tags":["End User Account Management"],"x-audience":"public","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"userId","in":"path","required":true,"description":"The ID of the end user to add the account to.","schema":{"type":"string","pattern":"^[a-zA-Z0-9-]{1,100}$"},"example":"e051beeb-7163-4527-a5b6-35e301529ff2"},{"$ref":"#/components/parameters/XWalletAuth"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"},"examples":{"default":{"summary":"Create Solana account","value":{}}}}}},"responses":{"201":{"description":"Successfully added Solana account to end user.","content":{"application/json":{"schema":{"type":"object","required":["solanaAccount"],"properties":{"solanaAccount":{"$ref":"#/components/schemas/EndUserSolanaAccount"}}},"examples":{"default":{"summary":"Solana account created","value":{"solanaAccount":{"address":"HpabPRRCFbBKSuJr5PdkVvQc85FyxyTWkFM2obBRSvHT","createdAt":"2025-11-17T10:00:00Z"}}}}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"max_accounts_reached":{"value":{"errorType":"invalid_request","errorMessage":"Maximum number of Solana accounts (10) reached for this end user."}}}}}},"401":{"description":"Unauthorized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"unauthorized":{"value":{"errorType":"unauthorized","errorMessage":"Wallet authentication error."}}}}}},"402":{"$ref":"#/components/responses/PaymentMethodRequiredError"},"404":{"description":"End user not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"End user with the given ID not found."}}}}}},"422":{"$ref":"#/components/responses/IdempotencyError"},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/end-users/import":{"post":{"summary":"Import end user private key","description":"Imports an existing private key for an end user into the developer's CDP Project. The private key must be encrypted using the CDP SDK's encryption scheme before being sent to this endpoint. This API should be called from the [CDP SDK](https://github.com/coinbase/cdp-sdk) to ensure that the associated private key is properly encrypted.\n\nThis endpoint allows developers to import existing keys for their end users, supporting both EVM and Solana key types. The end user must have at least one authentication method configured.","operationId":"importEndUser","tags":["End User Account Management"],"x-audience":"public","security":[{"apiKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/XWalletAuth"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"userId":{"description":"A stable, unique identifier for the end user. The `userId` must be unique across all end users in the developer's CDP Project. It must be between 1 and 100 characters long and can only contain alphanumeric characters and hyphens.","type":"string","pattern":"^[a-zA-Z0-9-]{1,100}$","example":"e051beeb-7163-4527-a5b6-35e301529ff2"},"authenticationMethods":{"$ref":"#/components/schemas/AuthenticationMethods"},"encryptedPrivateKey":{"type":"string","description":"The base64-encoded, encrypted private key to import. The private key must be encrypted using the CDP SDK's encryption scheme. This is a 32-byte raw private key.","example":"U2FsdGVkX1+vupppZksvRf5X5YgHq4+da+Q4qf51+Q4="},"keyType":{"type":"string","description":"The type of key being imported. Determines what type of account will be associated for the end user.","enum":["evm","solana"],"example":"evm"}},"required":["userId","authenticationMethods","encryptedPrivateKey","keyType"]},"examples":{"import_evm_key":{"summary":"Import an EVM private key","value":{"userId":"user-001","authenticationMethods":[{"type":"email","email":"user@example.com"}],"encryptedPrivateKey":"U2FsdGVkX1+vupppZksvRf5X5YgHq4+da+Q4qf51+Q4=","keyType":"evm"}},"import_solana_key":{"summary":"Import a Solana private key","value":{"userId":"user-002","authenticationMethods":[{"type":"sms","phoneNumber":"+15555551234"}],"encryptedPrivateKey":"U2FsdGVkX1+vupppZksvRf5X5YgHq4+da+Q4qf51+Q4=","keyType":"solana"}},"import_evm_key_with_jwt_auth":{"summary":"Import an EVM private key with JWT authentication","value":{"userId":"user-003","authenticationMethods":[{"type":"jwt","sub":"e051beeb-7163-4527-a5b6-35e301529ff2","kid":"NjVBRjY5MDlCMUIwNzU4RTA2QzZFMDQ4QzQ2MDAyQjVDNjk1RTM2Qg"}],"encryptedPrivateKey":"U2FsdGVkX1+vupppZksvRf5X5YgHq4+da+Q4qf51+Q4=","keyType":"evm"}}}}}},"responses":{"201":{"description":"Successfully imported key and created end user with the associated account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndUser"},"examples":{"evm_key_imported":{"summary":"End user with imported EVM account","value":{"userId":"user-001","authenticationMethods":[{"type":"email","email":"user@example.com"}],"evmAccounts":["0x742d35Cc6634C0532925a3b844Bc454e4438f44e"],"evmAccountObjects":[{"address":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","createdAt":"2025-11-17T10:00:00Z"}],"evmSmartAccounts":[],"evmSmartAccountObjects":[],"solanaAccounts":[],"solanaAccountObjects":[],"createdAt":"2025-11-17T10:00:00Z"}},"solana_key_imported":{"summary":"End user with imported Solana account","value":{"userId":"user-002","authenticationMethods":[{"type":"sms","phoneNumber":"+15555551234"}],"evmAccounts":[],"evmAccountObjects":[],"evmSmartAccounts":[],"evmSmartAccountObjects":[],"solanaAccounts":["HpabPRRCFbBKSuJr5PdkVvQc85FyxyTWkFM2obBRSvHT"],"solanaAccountObjects":[{"address":"HpabPRRCFbBKSuJr5PdkVvQc85FyxyTWkFM2obBRSvHT","createdAt":"2025-11-17T10:00:00Z"}],"createdAt":"2025-11-17T10:00:00Z"}}}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_key":{"value":{"errorType":"invalid_request","errorMessage":"The encrypted private key is invalid."}},"invalid_key_type":{"value":{"errorType":"invalid_request","errorMessage":"Invalid key type. Must be 'evm' or 'solana'."}},"missing_auth_methods":{"value":{"errorType":"invalid_request","errorMessage":"At least one authentication method must be provided."}}}}}},"401":{"description":"Unauthorized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"unauthorized":{"value":{"errorType":"unauthorized","errorMessage":"Wallet authentication error."}}}}}},"402":{"$ref":"#/components/responses/PaymentMethodRequiredError"},"409":{"description":"Resource already exists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"already_exists":{"value":{"errorType":"already_exists","errorMessage":"An account with the given address already exists."}}}}}},"422":{"$ref":"#/components/responses/IdempotencyError"},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/embedded-wallet-api/end-users/{userId}/evm/sign/transaction":{"post":{"x-audience":"public","summary":"Sign transaction via end user EVM account","description":"Signs a transaction with the given end user EVM account.\nThe transaction should be serialized as a hex string using [RLP](https://ethereum.org/en/developers/docs/data-structures-and-encoding/rlp/).\n\nThe transaction must be an [EIP-1559 dynamic fee transaction](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1559.md). The developer is responsible for ensuring that the unsigned transaction is valid, as the API will not validate the transaction.","operationId":"signEvmTransactionWithEndUserAccount","tags":["End User Accounts"],"security":[{"endUserAuth":[]},{"apiKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/XWalletAuthOptional"},{"$ref":"#/components/parameters/IdempotencyKey"},{"name":"userId","description":"The ID of the end user.","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9-]{1,100}$","example":"e051beeb-7163-4527-a5b6-35e301529ff2"}},{"$ref":"#/components/parameters/XDeveloperAuth"},{"$ref":"#/components/parameters/ProjectIDOptional"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"address":{"type":"string","description":"The 0x-prefixed address of the EVM account belonging to the end user.","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","pattern":"^0x[0-9a-fA-F]{40}$"},"transaction":{"type":"string","description":"The RLP-encoded transaction to sign, as a 0x-prefixed hex string.","example":"0xf86b098505d21dba00830334509431415daf58e2c6b7323b4c58712fd92952145da79018080"},"walletSecretId":{"description":"Required when not using delegated signing. The ID of the Temporary Wallet Secret that was used to sign the X-Wallet-Auth Header.","type":"string","pattern":"^[a-zA-Z0-9-]{1,100}$","example":"e051beeb-7163-4527-a5b6-35e301529ff2"}},"required":["address","transaction"]}}}},"responses":{"200":{"description":"Successfully signed transaction.","content":{"application/json":{"schema":{"type":"object","properties":{"signedTransaction":{"type":"string","description":"The RLP-encoded signed transaction, as a 0x-prefixed hex string.","example":"0x1b0c9cf8cd4554c6c6d9e7311e88f1be075d7f25b418a044f4bf2c0a42a93e212ad0a8b54de9e0b5f7e3812de3f2c6cc79aa8c3e1c02e7ad14b4a8f42012c2c01b"}},"required":["signedTransaction"]}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"malformed_transaction":{"value":{"errorType":"malformed_transaction","errorMessage":"Malformed unsigned transaction."}}}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"402":{"$ref":"#/components/responses/PaymentMethodRequiredError"},"403":{"$ref":"#/components/responses/DelegationForbiddenError"},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"EVM account with the given address not found."}}}}}},"409":{"$ref":"#/components/responses/AlreadyExistsError"},"422":{"$ref":"#/components/responses/IdempotencyError"},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/embedded-wallet-api/end-users/{userId}/evm/send/transaction":{"post":{"x-audience":"public","summary":"Send transaction via end user EVM account","description":"Signs a transaction with the given end user EVM account and sends it to the indicated supported network. This API handles nonce management and gas estimation, leaving the developer to provide only the minimal set of fields necessary to send the transaction. The transaction should be serialized as a hex string using [RLP](https://ethereum.org/en/developers/docs/data-structures-and-encoding/rlp/).\n\nThe transaction must be an [EIP-1559 dynamic fee transaction](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1559.md).\n\n\n**Transaction fields and API behavior**\n\n- `to` *(Required)*: The address of the contract or account to send the transaction to.\n- `chainId` *(Ignored)*: The value of the `chainId` field in the transaction is ignored.\n  The transaction will be sent to the network indicated by the `network` field in the request body.\n\n- `nonce` *(Optional)*: The nonce to use for the transaction. If not provided, the API will assign\n   a nonce to the transaction based on the current state of the account.\n\n- `maxPriorityFeePerGas` *(Optional)*: The maximum priority fee per gas to use for the transaction.\n   If not provided, the API will estimate a value based on current network conditions.\n\n- `maxFeePerGas` *(Optional)*: The maximum fee per gas to use for the transaction.\n   If not provided, the API will estimate a value based on current network conditions.\n\n- `gasLimit` *(Optional)*: The gas limit to use for the transaction. If not provided, the API will estimate a value\n  based on the `to` and `data` fields of the transaction.\n\n- `value` *(Optional)*: The amount of ETH, in wei, to send with the transaction.\n- `data` *(Optional)*: The data to send with the transaction; only used for contract calls.\n- `accessList` *(Optional)*: The access list to use for the transaction.","operationId":"sendEvmTransactionWithEndUserAccount","tags":["End User Accounts"],"security":[{"endUserAuth":[]},{"apiKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/XWalletAuthOptional"},{"$ref":"#/components/parameters/IdempotencyKey"},{"name":"userId","description":"The ID of the end user.","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9-]{1,100}$","example":"e051beeb-7163-4527-a5b6-35e301529ff2"}},{"$ref":"#/components/parameters/XDeveloperAuth"},{"$ref":"#/components/parameters/ProjectIDOptional"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"address":{"type":"string","description":"The 0x-prefixed address of the EVM account belonging to the end user.","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","pattern":"^0x[0-9a-fA-F]{40}$"},"network":{"type":"string","description":"The network to send the transaction to.","enum":["base","base-sepolia","ethereum","ethereum-sepolia","avalanche","polygon","optimism","arbitrum","arbitrum-sepolia","world","world-sepolia"],"example":"base-sepolia"},"walletSecretId":{"description":"Required when not using delegated signing. The ID of the Temporary Wallet Secret that was used to sign the X-Wallet-Auth Header.","type":"string","pattern":"^[a-zA-Z0-9-]{1,100}$","example":"e051beeb-7163-4527-a5b6-35e301529ff2"},"transaction":{"type":"string","description":"The RLP-encoded transaction to sign and send, as a 0x-prefixed hex string.","example":"0xf86b098505d21dba00830334509431415daf58e2c6b7323b4c58712fd92952145da79018080"}},"required":["address","transaction","network"]}}}},"responses":{"200":{"description":"Successfully signed and sent transaction.","content":{"application/json":{"schema":{"type":"object","properties":{"transactionHash":{"type":"string","description":"The hash of the transaction, as a 0x-prefixed hex string.","example":"0xf8f98fb6726fc936f24b2007df5cb20e2b8444ff3dfaa2a929335f432a9be2e7"}},"required":["transactionHash"]}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"malformed_transaction":{"value":{"errorType":"malformed_transaction","errorMessage":"Malformed unsigned transaction."}}}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"402":{"$ref":"#/components/responses/PaymentMethodRequiredError"},"403":{"$ref":"#/components/responses/DelegationForbiddenError"},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"EVM account with the given address not found."}}}}}},"409":{"$ref":"#/components/responses/AlreadyExistsError"},"422":{"$ref":"#/components/responses/IdempotencyError"},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/embedded-wallet-api/end-users/{userId}/evm/{address}/send/{asset}":{"post":{"x-audience":"public","summary":"Send USDC on EVM","description":"Sends USDC from an end user's EVM account (EOA or Smart Account) to a recipient address on a supported EVM network. This endpoint simplifies USDC transfers by automatically handling contract resolution, decimal conversion, gas estimation, and transaction encoding.\nThe `amount` field accepts human-readable amounts as decimal strings (e.g., \"1.5\", \"25.50\").","operationId":"sendEvmAssetWithEndUserAccount","tags":["End User Accounts"],"security":[{"endUserAuth":[]},{"apiKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/XWalletAuthOptional"},{"$ref":"#/components/parameters/IdempotencyKey"},{"name":"userId","in":"path","required":true,"description":"The ID of the end user.","schema":{"type":"string","pattern":"^[a-zA-Z0-9-]{1,100}$"},"example":"e051beeb-7163-4527-a5b6-35e301529ff2"},{"name":"address","description":"The 0x-prefixed address of the EVM account (EOA or Smart Account) to send USDC from. The address does not need to be checksummed.","in":"path","required":true,"schema":{"allOf":[{"$ref":"#/components/schemas/BlockchainAddress"}],"pattern":"^0x[0-9a-fA-F]{40}$"},"example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"},{"name":"asset","in":"path","required":true,"description":"The asset to send. Currently only \"usdc\" is supported.","schema":{"allOf":[{"$ref":"#/components/schemas/Asset"}],"enum":["usdc"]},"example":"usdc"},{"$ref":"#/components/parameters/XDeveloperAuth"},{"$ref":"#/components/parameters/ProjectIDOptional"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"to":{"allOf":[{"$ref":"#/components/schemas/BlockchainAddress"}],"pattern":"^0x[0-9a-fA-F]{40}$","description":"The 0x-prefixed address of the recipient.","example":"0x1234567890123456789012345678901234567890"},"amount":{"type":"string","minLength":1,"maxLength":32,"description":"The amount of USDC to send as a decimal string (e.g., \"1.5\" or \"25.50\").","example":"1.50"},"network":{"type":"string","description":"The EVM network to send USDC on.","enum":["base","base-sepolia","ethereum","ethereum-sepolia","avalanche","polygon","optimism","arbitrum","arbitrum-sepolia","world","world-sepolia"],"example":"base-sepolia"},"useCdpPaymaster":{"type":"boolean","description":"Whether to use CDP Paymaster to sponsor gas fees. Only applicable for EVM Smart Accounts. When true, the transaction gas will be paid by the Paymaster, allowing users to send USDC without holding native gas tokens. Ignored for EOA accounts. Cannot be used together with `paymasterUrl`.","example":true},"paymasterUrl":{"allOf":[{"$ref":"#/components/schemas/Url"}],"description":"Optional custom Paymaster URL to use for gas sponsorship. Only applicable for EVM Smart Accounts. This allows you to use your own Paymaster service instead of CDP's Paymaster. Cannot be used together with `useCdpPaymaster`.","example":"https://api.developer.coinbase.com/rpc/v1/base/AbCdEf123456"},"paymasterContext":{"$ref":"#/components/schemas/PaymasterContext"},"walletSecretId":{"description":"Required when not using delegated signing. The ID of the Temporary Wallet Secret that was used to sign the X-Wallet-Auth Header.","type":"string","pattern":"^[a-zA-Z0-9-]{1,100}$","example":"e051beeb-7163-4527-a5b6-35e301529ff2"}},"required":["to","amount","network"]},"examples":{"send_usdc_eoa":{"summary":"Send USDC from EOA","value":{"to":"0x1234567890123456789012345678901234567890","amount":"25.50","network":"base-sepolia","walletSecretId":"e051beeb-7163-4527-a5b6-35e301529ff2"}},"send_usdc_smart_account_cdp_paymaster":{"summary":"Send USDC from Smart Account with CDP Paymaster","value":{"to":"0x1234567890123456789012345678901234567890","amount":"10.00","network":"base-sepolia","useCdpPaymaster":true,"walletSecretId":"e051beeb-7163-4527-a5b6-35e301529ff2"}},"send_usdc_smart_account_custom_paymaster":{"summary":"Send USDC from Smart Account with custom Paymaster","value":{"to":"0x1234567890123456789012345678901234567890","amount":"15.00","network":"base-sepolia","paymasterUrl":"https://api.developer.coinbase.com/rpc/v1/base/AbCdEf123456","walletSecretId":"e051beeb-7163-4527-a5b6-35e301529ff2"}}}}}},"responses":{"200":{"description":"Successfully sent transaction.","content":{"application/json":{"schema":{"type":"object","properties":{"transactionHash":{"type":"string","description":"The hash of the transaction, as a 0x-prefixed hex string. Populated for EOA accounts. Null for Smart Accounts (use userOpHash instead).","example":"0xf8f98fb6726fc936f24b2007df5cb20e2b8444ff3dfaa2a929335f432a9be2e7","nullable":true},"userOpHash":{"type":"string","description":"The hash of the user operation, as a 0x-prefixed hex string. Populated for Smart Accounts. Null for EOA accounts (use transactionHash instead).","example":"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef","nullable":true}}},"examples":{"eoa_transfer":{"summary":"EOA transfer response","value":{"transactionHash":"0xf8f98fb6726fc936f24b2007df5cb20e2b8444ff3dfaa2a929335f432a9be2e7","userOpHash":null}},"smart_account_transfer":{"summary":"Smart Account transfer response","value":{"transactionHash":null,"userOpHash":"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"}}}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_amount":{"value":{"errorType":"invalid_request","errorMessage":"Invalid amount format. Amount must be a valid decimal string.","errorParam":"amount","errorLink":"https://docs.cdp.coinbase.com/api-reference/v2/errors#invalid-request"}},"invalid_network":{"value":{"errorType":"invalid_request","errorMessage":"Unsupported network for USDC transfers.","errorParam":"network","errorLink":"https://docs.cdp.coinbase.com/get-started/supported-networks#supported-networks"}},"invalid_asset":{"value":{"errorType":"invalid_request","errorMessage":"Unsupported asset. Currently only 'usdc' is supported.","errorParam":"asset","errorLink":"https://docs.cdp.coinbase.com/api-reference/v2/errors#invalid-request"}},"insufficient_balance":{"value":{"errorType":"invalid_request","errorMessage":"Account has insufficient USDC balance to complete the transfer.","errorParam":"amount","errorLink":"https://docs.cdp.coinbase.com/api-reference/v2/errors#invalid-request"}},"conflicting_paymaster":{"value":{"errorType":"invalid_request","errorMessage":"Cannot specify both 'useCdpPaymaster' and 'paymasterUrl'. Please use only one.","errorLink":"https://docs.cdp.coinbase.com/embedded-wallets/evm-features/smart-accounts#gas-sponsorship-with-paymaster"}},"paymaster_context_without_paymaster":{"value":{"errorType":"invalid_request","errorMessage":"paymasterContext requires a paymaster: set paymasterUrl or useCdpPaymaster.","errorParam":"paymasterContext","errorLink":"https://docs.cdp.coinbase.com/embedded-wallets/evm-features/smart-accounts#gas-sponsorship-with-paymaster"}}}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"402":{"$ref":"#/components/responses/PaymentMethodRequiredError"},"403":{"$ref":"#/components/responses/DelegationForbiddenError"},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"EVM account with the given address not found.","errorParam":"address","errorLink":"https://docs.cdp.coinbase.com/api-reference/v2/errors#not-found"}}}}}},"422":{"$ref":"#/components/responses/IdempotencyError"},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/embedded-wallet-api/end-users/{userId}/evm/sign/message":{"post":{"x-audience":"public","summary":"Sign EIP-191 message via end user EVM account","description":"Signs an [EIP-191](https://eips.ethereum.org/EIPS/eip-191) message with the given end user EVM account.\n\nPer the specification, the message in the request body is prepended with `0x19 <0x45 (E)> <thereum Signed Message:\\n\" + len(message)>` before being signed.","operationId":"signEvmMessageWithEndUserAccount","tags":["End User Accounts"],"security":[{"endUserAuth":[]},{"apiKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/XWalletAuthOptional"},{"$ref":"#/components/parameters/IdempotencyKey"},{"name":"userId","description":"The ID of the end user.","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9-]{1,100}$","example":"e051beeb-7163-4527-a5b6-35e301529ff2"}},{"$ref":"#/components/parameters/XDeveloperAuth"},{"$ref":"#/components/parameters/ProjectIDOptional"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"address":{"type":"string","description":"The 0x-prefixed address of the EVM account belonging to the end user.","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","pattern":"^0x[0-9a-fA-F]{40}$"},"message":{"type":"string","description":"The message to sign.","example":"Hello, world!"},"walletSecretId":{"description":"Required when not using delegated signing. The ID of the Temporary Wallet Secret that was used to sign the X-Wallet-Auth Header.","type":"string","pattern":"^[a-zA-Z0-9-]{1,100}$","example":"e051beeb-7163-4527-a5b6-35e301529ff2"}},"required":["address","message"]}}}},"responses":{"200":{"description":"Successfully signed message.","content":{"application/json":{"schema":{"type":"object","properties":{"signature":{"type":"string","description":"The signature of the message, as a 0x-prefixed hex string.","example":"0x1b0c9cf8cd4554c6c6d9e7311e88f1be075d7f25b418a044f4bf2c0a42a93e212ad0a8b54de9e0b5f7e3812de3f2c6cc79aa8c3e1c02e7ad14b4a8f42012c2c01b"}},"required":["signature"]}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"402":{"$ref":"#/components/responses/PaymentMethodRequiredError"},"403":{"$ref":"#/components/responses/DelegationForbiddenError"},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"EVM account with the given address not found."}}}}}},"409":{"$ref":"#/components/responses/AlreadyExistsError"},"422":{"$ref":"#/components/responses/IdempotencyError"},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/embedded-wallet-api/end-users/{userId}/evm/sign/typed-data":{"post":{"x-audience":"public","summary":"Sign EIP-712 typed data via end user EVM account","description":"Signs [EIP-712](https://eips.ethereum.org/EIPS/eip-712) typed data with the given end user EVM account.","operationId":"signEvmTypedDataWithEndUserAccount","tags":["End User Accounts"],"security":[{"endUserAuth":[]},{"apiKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/XWalletAuthOptional"},{"$ref":"#/components/parameters/IdempotencyKey"},{"name":"userId","description":"The ID of the end user.","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9-]{1,100}$","example":"e051beeb-7163-4527-a5b6-35e301529ff2"}},{"$ref":"#/components/parameters/XDeveloperAuth"},{"$ref":"#/components/parameters/ProjectIDOptional"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"address":{"type":"string","description":"The 0x-prefixed address of the EVM account belonging to the end user.","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","pattern":"^0x[0-9a-fA-F]{40}$"},"typedData":{"$ref":"#/components/schemas/EIP712Message"},"walletSecretId":{"description":"Required when not using delegated signing. The ID of the Temporary Wallet Secret that was used to sign the X-Wallet-Auth Header.","type":"string","pattern":"^[a-zA-Z0-9-]{1,100}$","example":"e051beeb-7163-4527-a5b6-35e301529ff2"}},"required":["address","typedData"]}}}},"responses":{"200":{"description":"Successfully signed typed data.","content":{"application/json":{"schema":{"type":"object","properties":{"signature":{"type":"string","description":"The signature of the typed data, as a 0x-prefixed hex string.","example":"0x1b0c9cf8cd4554c6c6d9e7311e88f1be075d7f25b418a044f4bf2c0a42a93e212ad0a8b54de9e0b5f7e3812de3f2c6cc79aa8c3e1c02e7ad14b4a8f42012c2c01b"}},"required":["signature"]}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"Invalid request. Please check the request body and parameters."}}}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"402":{"$ref":"#/components/responses/PaymentMethodRequiredError"},"403":{"$ref":"#/components/responses/DelegationForbiddenError"},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"EVM account with the given address not found."}}}}}},"422":{"$ref":"#/components/responses/IdempotencyError"},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/embedded-wallet-api/end-users/{userId}/delegation":{"get":{"x-audience":"public","summary":"Get delegation for end user","description":"Returns the active delegation for the specified end user, if one exists. This operation can be performed by the end user themselves or by a developer using their API key.","operationId":"getDelegationForEndUser","tags":["End User Accounts"],"security":[{"endUserAuth":[]},{"apiKeyAuth":[]}],"parameters":[{"name":"userId","in":"path","required":true,"description":"The ID of the end user.","schema":{"type":"string","pattern":"^[a-zA-Z0-9-]{1,100}$","example":"e051beeb-7163-4527-a5b6-35e301529ff2"}},{"$ref":"#/components/parameters/ProjectIDOptional"}],"responses":{"200":{"description":"Active delegation found.","content":{"application/json":{"schema":{"type":"object","properties":{"expiresAt":{"type":"string","format":"date-time","description":"The date until which the delegation is valid.","example":"2026-02-03T10:35:00Z"}},"required":["expiresAt"]},"example":{"expiresAt":"2026-02-03T10:35:00Z"}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"404":{"description":"No active delegation found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"No active delegation found for the specified end user.","errorParam":"userId","errorLink":"https://docs.cdp.coinbase.com/api-reference/v2/errors#not-found"}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}},"delete":{"x-audience":"public","summary":"Revoke delegation for end user","description":"Revokes all active delegations for the specified end user. This operation can be performed by the end user themselves or by a developer using their API key.","operationId":"revokeDelegationForEndUser","tags":["End User Accounts"],"security":[{"endUserAuth":[]},{"apiKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/XWalletAuthOptional"},{"$ref":"#/components/parameters/XDeveloperAuth","required":false},{"$ref":"#/components/parameters/IdempotencyKey"},{"name":"userId","in":"path","required":true,"description":"The ID of the end user.","schema":{"type":"string","pattern":"^[a-zA-Z0-9-]{1,100}$","example":"e051beeb-7163-4527-a5b6-35e301529ff2"}},{"$ref":"#/components/parameters/ProjectIDOptional"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"walletSecretId":{"description":"When revoking with a wallet authentication scheme, the ID of the Temporary Wallet Secret that was used to sign the X-Wallet-Auth Header.","type":"string","pattern":"^[a-zA-Z0-9-]{1,100}$","example":"e051beeb-7163-4527-a5b6-35e301529ff2"}}},"example":{"walletSecretId":"e051beeb-7163-4527-a5b6-35e301529ff2"}}}},"responses":{"204":{"description":"Delegation revoked successfully."},"401":{"$ref":"#/components/responses/UnauthorizedError"},"404":{"description":"Delegation not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"No active delegation found for the specified end user.","errorParam":"userId","errorLink":"https://docs.cdp.coinbase.com/api-reference/v2/errors#not-found"}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/embedded-wallet-api/end-users/{userId}/address/{address}/delegation":{"post":{"x-audience":"public","summary":"Create account-scoped delegation for end user","description":"Creates an account-scoped delegation that allows a developer to sign on behalf of an end user for a single blockchain account (identified by its address) for the specified duration. The end user must be authenticated to authorize this delegation.\nMultiple account-scoped delegations may exist concurrently for a single end user (one per canonical account address). Account-scoped and user-scoped delegations cannot coexist for the same user.\nWhen the address corresponds to an EVM Smart Account, the delegation is scoped to the Smart Account's owner EOA rather than the Smart Account address itself. This means `/address/{smartAccountAddress}/delegation` and `/address/{ownerEoaAddress}/delegation` resolve to the same delegation, and the 409 `account_scoped_delegation_active` error may be returned when creating via either address if one already exists for the canonical owner.","operationId":"createDelegationForEndUserAccount","tags":["End User Accounts"],"security":[{"endUserAuth":[]}],"parameters":[{"$ref":"#/components/parameters/XWalletAuth"},{"$ref":"#/components/parameters/IdempotencyKey"},{"name":"userId","in":"path","required":true,"description":"The ID of the end user.","schema":{"type":"string","pattern":"^[a-zA-Z0-9-]{1,100}$","example":"e051beeb-7163-4527-a5b6-35e301529ff2"}},{"name":"address","in":"path","required":true,"description":"The blockchain address of the end user account to scope this delegation to. Format varies by network (e.g., 0x-prefixed for EVM, base58 for Solana). For EVM addresses, matching is case-insensitive.","schema":{"$ref":"#/components/schemas/BlockchainAddress"},"example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"},{"$ref":"#/components/parameters/ProjectIDOptional"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"expiresAt":{"type":"string","format":"date-time","description":"The date until which the delegation is valid.","example":"2026-02-03T10:35:00Z"},"walletSecretId":{"description":"The ID of the Temporary Wallet Secret that was used to sign the X-Wallet-Auth Header.","type":"string","pattern":"^[a-zA-Z0-9-]{1,100}$","example":"e051beeb-7163-4527-a5b6-35e301529ff2"}},"required":["expiresAt","walletSecretId"]},"example":{"expiresAt":"2026-02-03T10:35:00Z","walletSecretId":"e051beeb-7163-4527-a5b6-35e301529ff2"}}}},"responses":{"201":{"description":"Delegation created successfully.","content":{"application/json":{"schema":{"type":"object","properties":{"expiresAt":{"type":"string","format":"date-time","description":"The date until which the delegation is valid.","example":"2026-02-03T10:35:00Z"}},"required":["expiresAt"]},"example":{"expiresAt":"2026-02-03T10:35:00Z"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"missing_expiresAt":{"value":{"errorType":"invalid_request","errorMessage":"Field 'expiresAt' is required.","errorParam":"expiresAt","errorLink":"https://docs.cdp.coinbase.com/api-reference/v2/errors#invalid-request"}},"invalid_expiresAt":{"value":{"errorType":"invalid_request","errorMessage":"Field 'expiresAt' must be a valid ISO 8601 string.","errorParam":"expiresAt","errorLink":"https://docs.cdp.coinbase.com/api-reference/v2/errors#invalid-request"}}}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"402":{"$ref":"#/components/responses/PaymentMethodRequiredError"},"404":{"description":"Account not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"unknown_address":{"value":{"errorType":"not_found","errorMessage":"No account with the given address exists for this end user.","errorParam":"address","errorLink":"https://docs.cdp.coinbase.com/api-reference/v2/errors#not-found"}}}}}},"409":{"description":"Conflict with an existing delegation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"user_scoped_delegation_active":{"value":{"errorType":"already_exists","errorMessage":"A user-scoped delegation is already active for this user. Revoke it before creating an account-scoped delegation.","errorLink":"https://docs.cdp.coinbase.com/api-reference/v2/errors#already-exists"}},"account_scoped_delegation_active":{"value":{"errorType":"already_exists","errorMessage":"An account-scoped delegation is already active for this address.","errorParam":"address","errorLink":"https://docs.cdp.coinbase.com/api-reference/v2/errors#already-exists"}}}}}},"422":{"$ref":"#/components/responses/IdempotencyError"},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"rate_limit_exceeded":{"value":{"errorType":"rate_limit_exceeded","errorMessage":"Too many requests. Please try again later.","errorLink":"https://docs.cdp.coinbase.com/api-reference/v2/errors#rate-limit-exceeded"}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}},"get":{"x-audience":"public","summary":"Get account-scoped delegation for end user","description":"Returns the active account-scoped delegation for the specified end user account, if one exists. Useful for showing delegation status in a UI.\nWhen the address corresponds to an EVM Smart Account, this returns the delegation for the Smart Account's owner EOA.","operationId":"getDelegationForEndUserAccount","tags":["End User Accounts"],"security":[{"endUserAuth":[]},{"apiKeyAuth":[]}],"parameters":[{"name":"userId","in":"path","required":true,"description":"The ID of the end user.","schema":{"type":"string","pattern":"^[a-zA-Z0-9-]{1,100}$","example":"e051beeb-7163-4527-a5b6-35e301529ff2"}},{"name":"address","in":"path","required":true,"description":"The blockchain address of the end user account to query. For EVM addresses, matching is case-insensitive.","schema":{"$ref":"#/components/schemas/BlockchainAddress"},"example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"},{"$ref":"#/components/parameters/ProjectIDOptional"}],"responses":{"200":{"description":"Active delegation found.","content":{"application/json":{"schema":{"type":"object","properties":{"expiresAt":{"type":"string","format":"date-time","description":"The date until which the delegation is valid.","example":"2026-02-03T10:35:00Z"}},"required":["expiresAt"]},"example":{"expiresAt":"2026-02-03T10:35:00Z"}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"404":{"description":"No active delegation found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"No active account-scoped delegation found for the specified address.","errorParam":"address","errorLink":"https://docs.cdp.coinbase.com/api-reference/v2/errors#not-found"}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}},"delete":{"x-audience":"public","summary":"Revoke account-scoped delegation for end user","description":"Revokes the active account-scoped delegation for the specified end user account. Other account-scoped delegations for the same user are unaffected. This operation can be performed by the end user themselves or by a developer using their API key.\nWhen the address corresponds to an EVM Smart Account, this revokes the delegation for the Smart Account's owner EOA.","operationId":"revokeDelegationForEndUserAccount","tags":["End User Accounts"],"security":[{"endUserAuth":[]},{"apiKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/XWalletAuthOptional"},{"$ref":"#/components/parameters/XDeveloperAuth","required":false},{"$ref":"#/components/parameters/IdempotencyKey"},{"name":"userId","in":"path","required":true,"description":"The ID of the end user.","schema":{"type":"string","pattern":"^[a-zA-Z0-9-]{1,100}$","example":"e051beeb-7163-4527-a5b6-35e301529ff2"}},{"name":"address","in":"path","required":true,"description":"The blockchain address of the end user account whose delegation should be revoked. For EVM addresses, matching is case-insensitive.","schema":{"$ref":"#/components/schemas/BlockchainAddress"},"example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"},{"$ref":"#/components/parameters/ProjectIDOptional"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"walletSecretId":{"description":"When revoking with a wallet authentication scheme, the ID of the Temporary Wallet Secret that was used to sign the X-Wallet-Auth Header.","type":"string","pattern":"^[a-zA-Z0-9-]{1,100}$","example":"e051beeb-7163-4527-a5b6-35e301529ff2"}}},"example":{"walletSecretId":"e051beeb-7163-4527-a5b6-35e301529ff2"}}}},"responses":{"204":{"description":"Delegation revoked successfully."},"401":{"$ref":"#/components/responses/UnauthorizedError"},"404":{"description":"Delegation not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"No active account-scoped delegation found for the specified address.","errorParam":"address","errorLink":"https://docs.cdp.coinbase.com/api-reference/v2/errors#not-found"}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/embedded-wallet-api/end-users/{userId}/evm/eip7702/delegation":{"post":{"x-audience":"public","summary":"Create EIP-7702 delegation for end user EVM account","description":"Creates an EIP-7702 delegation for an end user's EVM EOA account, upgrading it with smart account capabilities.\n\nThis endpoint:\n- Retrieves delegation artifacts from onchain\n- Signs the EIP-7702 authorization for delegation\n- Assembles and submits a Type 4 transaction\n- Creates an associated smart account object\n\nThe delegation allows the EVM EOA to be used as a smart account, which enables batched transactions and gas sponsorship via paymaster.","operationId":"createEvmEip7702DelegationWithEndUserAccount","tags":["End User Accounts"],"security":[{"endUserAuth":[]},{"apiKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/XWalletAuthOptional"},{"$ref":"#/components/parameters/IdempotencyKey"},{"name":"userId","in":"path","required":true,"description":"The ID of the end user.","schema":{"type":"string","pattern":"^[a-zA-Z0-9-]{1,100}$","example":"e051beeb-7163-4527-a5b6-35e301529ff2"}},{"$ref":"#/components/parameters/XDeveloperAuth"},{"$ref":"#/components/parameters/ProjectIDOptional"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"address":{"type":"string","description":"The 0x-prefixed address of the EVM account to delegate.","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","pattern":"^0x[0-9a-fA-F]{40}$"},"network":{"$ref":"#/components/schemas/EvmEip7702DelegationNetwork"},"enableSpendPermissions":{"type":"boolean","description":"Whether to configure spend permissions for the upgraded, delegated account. When enabled, the account can grant permissions for third parties to spend on its behalf.","default":false,"example":true},"walletSecretId":{"description":"Required when not using delegated signing. The ID of the Temporary Wallet Secret that was used to sign the X-Wallet-Auth Header.","type":"string","pattern":"^[a-zA-Z0-9-]{1,100}$","example":"e051beeb-7163-4527-a5b6-35e301529ff2"}},"required":["address","network"]}}}},"responses":{"201":{"description":"Delegation operation created successfully.","content":{"application/json":{"schema":{"type":"object","properties":{"delegationOperationId":{"type":"string","format":"uuid","description":"The unique identifier for the delegation operation. Use this to poll the operation status.","example":"a1b2c3d4-e5f6-7890-abcd-ef1234567890"}},"required":["delegationOperationId"]}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"missing_network":{"value":{"errorType":"invalid_request","errorMessage":"Field 'network' is required.","errorParam":"network","errorLink":"https://docs.cdp.coinbase.com/api-reference/v2/errors#invalid-request"}},"unsupported_network":{"value":{"errorType":"invalid_request","errorMessage":"Network 'gnosis' is not supported for EIP-7702.","errorParam":"network","errorLink":"https://docs.cdp.coinbase.com/api-reference/v2/errors#invalid-request"}}}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"402":{"$ref":"#/components/responses/PaymentMethodRequiredError"},"403":{"$ref":"#/components/responses/DelegationForbiddenError"},"404":{"description":"EVM account not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"EVM account with the given address not found.","errorParam":"address","errorLink":"https://docs.cdp.coinbase.com/api-reference/v2/errors#not-found"}}}}}},"409":{"description":"Account already delegated on the given network.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"already_delegated":{"value":{"errorType":"already_exists","errorMessage":"Account already has an active EIP-7702 delegation on the given network.","errorParam":"address","errorLink":"https://docs.cdp.coinbase.com/api-reference/v2/errors#already-exists"}}}}}},"422":{"$ref":"#/components/responses/IdempotencyError"},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"rate_limit_exceeded":{"value":{"errorType":"rate_limit_exceeded","errorMessage":"Too many requests. Please try again later.","errorLink":"https://docs.cdp.coinbase.com/api-reference/v2/errors#rate-limit-exceeded"}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/embedded-wallet-api/end-users/{userId}/evm/smart-accounts/{address}/send":{"post":{"x-audience":"public","summary":"Send user operation for end user Smart Account","description":"Prepares, signs, and sends a user operation for an end user's Smart Account.","operationId":"sendUserOperationWithEndUserAccount","tags":["End User Accounts"],"security":[{"endUserAuth":[]},{"apiKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"},{"$ref":"#/components/parameters/XWalletAuthOptional"},{"name":"userId","in":"path","required":true,"description":"The ID of the end user.","schema":{"type":"string","pattern":"^[a-zA-Z0-9-]{1,100}$","example":"e051beeb-7163-4527-a5b6-35e301529ff2"}},{"name":"address","description":"The address of the EVM Smart Account to execute the user operation from.","in":"path","required":true,"schema":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"},{"$ref":"#/components/parameters/XDeveloperAuth"},{"$ref":"#/components/parameters/ProjectIDOptional"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"network":{"$ref":"#/components/schemas/EvmUserOperationNetwork"},"calls":{"type":"array","description":"The list of calls to make from the Smart Account.","items":{"$ref":"#/components/schemas/EvmCall"}},"useCdpPaymaster":{"type":"boolean","description":"Whether to use the CDP Paymaster for the user operation.","example":true},"paymasterUrl":{"allOf":[{"$ref":"#/components/schemas/Url"}],"description":"The URL of the paymaster to use for the user operation. If using the CDP Paymaster, use the `useCdpPaymaster` option.","example":"https://api.developer.coinbase.com/rpc/v1/base/<token>"},"paymasterContext":{"$ref":"#/components/schemas/PaymasterContext"},"walletSecretId":{"description":"Required when not using delegated signing. The ID of the Temporary Wallet Secret that was used to sign the X-Wallet-Auth Header.","type":"string","pattern":"^[a-zA-Z0-9-]{1,100}$","example":"e051beeb-7163-4527-a5b6-35e301529ff2"},"dataSuffix":{"type":"string","pattern":"^0x[0-9a-fA-F]+$","description":"The EIP-8021 data suffix (hex-encoded) that enables transaction attribution for the user operation.","example":"0xdddddddd62617365617070070080218021802180218021802180218021"}},"required":["network","calls","useCdpPaymaster"]}}}},"responses":{"200":{"description":"The user operation was successfully prepared, signed, and sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvmUserOperation"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"Field \"network\" is required."}},"paymaster_context_without_paymaster":{"value":{"errorType":"invalid_request","errorMessage":"paymasterContext requires a paymaster: set paymasterUrl or useCdpPaymaster."}},"invalid_signature":{"value":{"errorType":"invalid_signature","errorMessage":"Failed to sign user operation."}}}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"402":{"$ref":"#/components/responses/PaymentMethodRequiredError"},"403":{"$ref":"#/components/responses/DelegationForbiddenError"},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"End user Smart Account with the given address not found."}}}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"rate_limit_exceeded":{"value":{"errorType":"rate_limit_exceeded","errorMessage":"Max concurrent user operations reached."}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/embedded-wallet-api/end-users/{userId}/solana/sign/message":{"post":{"x-audience":"public","summary":"Sign Base64-encoded message","description":"Signs an arbitrary Base64 encoded message with the given Solana account.\n**WARNING:**  Never sign a message that you didn't generate as it may put your funds at risk.","operationId":"signSolanaMessageWithEndUserAccount","tags":["End User Accounts"],"security":[{"endUserAuth":[]},{"apiKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/XWalletAuthOptional"},{"$ref":"#/components/parameters/IdempotencyKey"},{"name":"userId","description":"The ID of the end user.","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9-]{1,100}$","example":"e051beeb-7163-4527-a5b6-35e301529ff2"}},{"$ref":"#/components/parameters/XDeveloperAuth"},{"$ref":"#/components/parameters/ProjectIDOptional"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"address":{"type":"string","description":"The base58 encoded address of the Solana account belonging to the end user.","example":"HpabPRRCFbBKSuJr5PdkVvQc85FyxyTWkFM2obBRSvHT","pattern":"^[1-9A-HJ-NP-Za-km-z]{32,44}$"},"message":{"type":"string","description":"The base64 encoded arbitrary message to sign.","example":"SGVsbG8sIHdvcmxk"},"walletSecretId":{"description":"Required when not using delegated signing. The ID of the Temporary Wallet Secret that was used to sign the X-Wallet-Auth Header.","type":"string","pattern":"^[a-zA-Z0-9-]{1,100}$","example":"e051beeb-7163-4527-a5b6-35e301529ff2"}},"required":["address","message"]}}}},"responses":{"200":{"description":"Successfully signed message.","content":{"application/json":{"schema":{"type":"object","properties":{"signature":{"type":"string","description":"The signature of the message, as a base58 encoded string.","example":"4YecmNqVT9QFqzuSvE9Zih3toZzNAijjXpj8xupgcC6E4VzwzFjuZBk5P99yz9JQaLRLm1K4L4FpMjxByFxQBe2h"}},"required":["signature"]}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"malformed_transaction":{"value":{"errorType":"invalid_request","errorMessage":"Malformed message to sign."}}}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"402":{"$ref":"#/components/responses/PaymentMethodRequiredError"},"403":{"$ref":"#/components/responses/DelegationForbiddenError"},"404":{"description":"Solana account not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"Solana account with the given address not found."}}}}}},"409":{"$ref":"#/components/responses/AlreadyExistsError"},"422":{"$ref":"#/components/responses/IdempotencyError"},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/embedded-wallet-api/end-users/{userId}/solana/sign/transaction":{"post":{"x-audience":"public","summary":"Sign transaction via end user Solana account","description":"Signs a transaction with the given end user Solana account.\nThe unsigned transaction should be serialized into a byte array and then encoded as base64.\n**Transaction types**\nThe following transaction types are supported:\n* [Legacy transactions](https://solana-labs.github.io/solana-web3.js/classes/Transaction.html)\n* [Versioned transactions](https://solana-labs.github.io/solana-web3.js/classes/VersionedTransaction.html)\nThe developer is responsible for ensuring that the unsigned transaction is valid, as the API will not validate the transaction.","operationId":"signSolanaTransactionWithEndUserAccount","tags":["End User Accounts"],"security":[{"endUserAuth":[]},{"apiKeyAuth":[]}],"parameters":[{"name":"userId","in":"path","required":true,"description":"The ID of the end user.","schema":{"type":"string","pattern":"^[a-zA-Z0-9-]{1,100}$","example":"e051beeb-7163-4527-a5b6-35e301529ff2"}},{"$ref":"#/components/parameters/XWalletAuthOptional"},{"$ref":"#/components/parameters/IdempotencyKey"},{"$ref":"#/components/parameters/XDeveloperAuth"},{"$ref":"#/components/parameters/ProjectIDOptional"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"address":{"type":"string","description":"The base58 encoded address of the Solana account belonging to the end user.","example":"HpabPRRCFbBKSuJr5PdkVvQc85FyxyTWkFM2obBRSvHT","pattern":"^[1-9A-HJ-NP-Za-km-z]{32,44}$"},"transaction":{"type":"string","description":"The base64 encoded transaction to sign.","example":"AQABAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAQECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8CBgMBAQAAAAIBAwQAAAAABgIAAAAAAAYDBQEBAAAGBAgAAAAABgUAAAAA6AMAAAAAAAAGBgUBAQEBBgcEAQAAAAYICgMBAQIDBgkCBgAAAAYKAwABAQEGCwMGAQEBBgwDAAABAQAAAAA="},"walletSecretId":{"description":"Required when not using delegated signing. The ID of the Temporary Wallet Secret that was used to sign the X-Wallet-Auth Header.","type":"string","pattern":"^[a-zA-Z0-9-]{1,100}$","example":"e051beeb-7163-4527-a5b6-35e301529ff2"}},"required":["address","transaction"]}}}},"responses":{"200":{"description":"Successfully signed transaction.","content":{"application/json":{"schema":{"type":"object","properties":{"signedTransaction":{"type":"string","description":"The base64 encoded signed transaction.","example":"AQACAdSOvpk0UJXs/rQRXYKSI9hcR0bkGp24qGv6t0/M1XjcQpHf6AHwLcPjEtKQI7p/U0Zo98lnJ5/PZMfVq/0BAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAQECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8CBgMBAQAAAAIBAwQAAAAABgIAAAAAAAYDBQEBAAAGBAgAAAAABgUAAAAA6AMAAAAAAAAGBgUBAQEBBgcEAQAAAAYICgMBAQIDBgkCBgAAAAYKAwABAQEGCwMGAQEBBgwDAAABAQAAAAA="}},"required":["signedTransaction"]}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"malformed_transaction":{"value":{"errorType":"malformed_transaction","errorMessage":"Malformed unsigned transaction."}}}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"402":{"$ref":"#/components/responses/PaymentMethodRequiredError"},"403":{"$ref":"#/components/responses/DelegationForbiddenError"},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"End user with the given ID not found."}}}}}},"409":{"$ref":"#/components/responses/AlreadyExistsError"},"422":{"$ref":"#/components/responses/IdempotencyError"},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/embedded-wallet-api/end-users/{userId}/solana/sign/x402-payment":{"post":{"x-audience":"public","summary":"Sign x402 payment via end user Solana account","description":"Signs an x402 payment payload using the end user's given Solana account.\nAccepts the full x402 payment required response body from a resource server plus an index into the accepts array selecting which payment option to sign. The paymentRequired envelope's x402Version, resource, and extensions are carried through into the signed payment payload; only the selected accept entry becomes paymentPayload.accepted.\nReturns a signed payment payload that can be base64-encoded and sent in the PAYMENT-SIGNATURE header of the resource request.\nIf acceptsIndex is out of range for paymentRequired.accepts, or the selected accept is not a Solana network payment option, the request fails with 422.","operationId":"signSolanaX402PaymentWithEndUserAccount","tags":["End User Accounts"],"security":[{"endUserAuth":[]},{"apiKeyAuth":[]}],"parameters":[{"name":"userId","in":"path","required":true,"description":"The ID of the end user.","schema":{"type":"string","pattern":"^[a-zA-Z0-9-]{1,100}$","example":"e051beeb-7163-4527-a5b6-35e301529ff2"}},{"$ref":"#/components/parameters/XWalletAuthOptional"},{"$ref":"#/components/parameters/IdempotencyKey"},{"$ref":"#/components/parameters/XDeveloperAuth"},{"$ref":"#/components/parameters/ProjectIDOptional"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"paymentRequired":{"allOf":[{"$ref":"#/components/schemas/x402PaymentRequired"}],"description":"The complete x402 payment required response body from the resource server. Top-level fields (x402Version, resource, error, extensions) are preserved in the signed payment payload; acceptsIndex selects which entry from accepts is signed as paymentPayload.accepted."},"acceptsIndex":{"type":"integer","minimum":0,"description":"Zero-based index into paymentRequired.accepts selecting which payment option to sign. Must be less than the length of accepts. The entry at this index must be a Solana network payment option for this endpoint.","example":0},"address":{"type":"string","description":"The base58 encoded address of the end user's Solana account to sign with.","example":"HpabPRRCFbBKSuJr5PdkVvQc85FyxyTWkFM2obBRSvHT","pattern":"^[1-9A-HJ-NP-Za-km-z]{32,44}$"},"walletSecretId":{"type":"string","description":"Required when not using delegated signing. The ID of the Temporary Wallet Secret that was used to sign the X-Wallet-Auth Header.","pattern":"^[a-zA-Z0-9-]{1,100}$","example":"e051beeb-7163-4527-a5b6-35e301529ff2"}},"required":["paymentRequired","acceptsIndex","address"]},"examples":{"mainnet_solana":{"summary":"Mainnet Solana USDC payment, first accept option","value":{"paymentRequired":{"x402Version":2,"resource":{"url":"https://api.example.com/premium/resource/123","description":"Premium API access for data analysis.","mimeType":"application/json"},"accepts":[{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"1000000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"2wKupLR9q6wXYppw8Gr2NvWxKBUqm4PPJKkQfoxHDBg4","maxTimeoutSeconds":60}]},"acceptsIndex":0,"address":"HpabPRRCFbBKSuJr5PdkVvQc85FyxyTWkFM2obBRSvHT","walletSecretId":"e051beeb-7163-4527-a5b6-35e301529ff2"}},"mainnet_base":{"summary":"Resource accepting both Base and Solana USDC; pick Solana entry at index 1","value":{"paymentRequired":{"x402Version":2,"resource":{"url":"https://api.example.com/premium/resource/123","description":"Premium API access for data analysis.","mimeType":"application/json"},"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"1000000","asset":"0x036CbD53842c5426634e7929541eC2318f3dCF7e","payTo":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","maxTimeoutSeconds":60},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"1000000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"2wKupLR9q6wXYppw8Gr2NvWxKBUqm4PPJKkQfoxHDBg4","maxTimeoutSeconds":60}]},"acceptsIndex":1,"address":"HpabPRRCFbBKSuJr5PdkVvQc85FyxyTWkFM2obBRSvHT","walletSecretId":"e051beeb-7163-4527-a5b6-35e301529ff2"}}}}}},"responses":{"200":{"description":"Successfully signed x402 payment payload.","content":{"application/json":{"schema":{"type":"object","properties":{"paymentPayload":{"allOf":[{"$ref":"#/components/schemas/x402PaymentPayload"}],"description":"The signed x402 payment payload. Base64-encode this and send it in the PAYMENT-SIGNATURE header of the resource request."}},"required":["paymentPayload"]},"examples":{"signed_solana_payload":{"summary":"Signed Solana x402 payment payload","value":{"paymentPayload":{"x402Version":2,"accepted":{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"1000000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"2wKupLR9q6wXYppw8Gr2NvWxKBUqm4PPJKkQfoxHDBg4","maxTimeoutSeconds":60},"payload":{"transaction":"AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAED"}}}},"signed_solana_from_multi_network_payload":{"summary":"Signed Solana payload when resource server also accepts Base (index 1 selected)","value":{"paymentPayload":{"x402Version":2,"accepted":{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"1000000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"2wKupLR9q6wXYppw8Gr2NvWxKBUqm4PPJKkQfoxHDBg4","maxTimeoutSeconds":60},"payload":{"transaction":"AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAED"}}}}}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"Request body must be specified."}}}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"402":{"$ref":"#/components/responses/PaymentMethodRequiredError"},"403":{"$ref":"#/components/responses/DelegationForbiddenError"},"404":{"description":"Solana account not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"Solana account with the given address not found."}}}}}},"409":{"$ref":"#/components/responses/AlreadyExistsError"},"422":{"description":"Semantically invalid request. The idempotency key was reused with a different payload, acceptsIndex is out of range for paymentRequired.accepts, or the selected accept is not a Solana network payment option.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"idempotency_error":{"value":{"errorType":"idempotency_error","errorMessage":"Idempotency key '8e03978e-40d5-43e8-bc93-6894a57f9324' was already used with a different request payload. Please try again with a new idempotency key."}},"accepts_index_out_of_bounds":{"value":{"errorType":"invalid_request","errorMessage":"acceptsIndex is out of range for paymentRequired.accepts."}},"non_solana_accept":{"value":{"errorType":"invalid_request","errorMessage":"The payment option at acceptsIndex must be a Solana network accept."}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/embedded-wallet-api/end-users/{userId}/solana/send/transaction":{"post":{"x-audience":"public","summary":"Send transaction via end user Solana account","description":"Signs a transaction with the given end user Solana account and sends it to the indicated supported network.\nThe API handles recent blockhash management and fee estimation, leaving the developer to provide only the minimal set of fields necessary to send the transaction.\nThe unsigned transaction should be serialized into a byte array and then encoded as base64.\n**Transaction types**\nThe following transaction types are supported:\n* [Legacy transactions](https://solana.com/developers/guides/advanced/versions#current-transaction-versions)\n* [Versioned transactions](https://solana.com/developers/guides/advanced/versions)\n**Instruction Batching**\nTo batch multiple operations, include multiple instructions within a single transaction. All instructions within a transaction are executed atomically - if any instruction fails, the entire transaction fails and is rolled back.\n**Network Support**\nThe following Solana networks are supported:\n* `solana` - Solana Mainnet\n* `solana-devnet` - Solana Devnet\nThe developer is responsible for ensuring that the unsigned transaction is valid, as the API will not validate the transaction.","operationId":"sendSolanaTransactionWithEndUserAccount","tags":["End User Accounts"],"security":[{"endUserAuth":[]},{"apiKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/XWalletAuthOptional"},{"$ref":"#/components/parameters/IdempotencyKey"},{"$ref":"#/components/parameters/XDeveloperAuth"},{"name":"userId","description":"The ID of the end user.","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9-]{1,100}$","example":"e051beeb-7163-4527-a5b6-35e301529ff2"}},{"$ref":"#/components/parameters/ProjectIDOptional"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"address":{"type":"string","description":"The base58 encoded address of the Solana account belonging to the end user.","example":"HpabPRRCFbBKSuJr5PdkVvQc85FyxyTWkFM2obBRSvHT","pattern":"^[1-9A-HJ-NP-Za-km-z]{32,44}$"},"network":{"type":"string","description":"The Solana network to send the transaction to.","enum":["solana","solana-devnet"],"example":"solana-devnet"},"walletSecretId":{"description":"Required when not using delegated signing. The ID of the Temporary Wallet Secret that was used to sign the X-Wallet-Auth Header.","type":"string","pattern":"^[a-zA-Z0-9-]{1,100}$","example":"e051beeb-7163-4527-a5b6-35e301529ff2"},"transaction":{"type":"string","description":"The base64 encoded transaction to sign and send. This transaction can contain multiple instructions for native Solana batching.","example":"AQABAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAQECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8CBgMBAQAAAAIBAwQAAAAABgIAAAAAAAYDBQEBAAAGBAgAAAAABgUAAAAA6AMAAAAAAAAGBgUBAQEBBgcEAQAAAAYICgMBAQIDBgkCBgAAAAYKAwABAQEGCwMGAQEBBgwDAAABAQAAAAA="},"useCdpSponsor":{"type":"boolean","description":"Whether transaction fees should be sponsored by CDP. When true, CDP sponsors the transaction fees on behalf of the end user. When false, the end user is responsible for paying the transaction fees.","example":true}},"required":["address","network","transaction"]},"examples":{"send_transaction":{"summary":"Send a transaction","value":{"address":"HpabPRRCFbBKSuJr5PdkVvQc85FyxyTWkFM2obBRSvHT","network":"solana-devnet","transaction":"AQABAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAQECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8CBgMBAQAAAAIBAwQAAAAABgIAAAAAAAYDBQEBAAAGBAgAAAAABgUAAAAA6AMAAAAAAAAGBgUBAQEBBgcEAQAAAAYICgMBAQIDBgkCBgAAAAYKAwABAQEGCwMGAQEBBgwDAAABAQAAAAA=","walletSecretId":"e051beeb-7163-4527-a5b6-35e301529ff2"}},"send_transaction_sponsored":{"summary":"Send a transaction with CDP gas sponsorship","value":{"address":"HpabPRRCFbBKSuJr5PdkVvQc85FyxyTWkFM2obBRSvHT","network":"solana-devnet","transaction":"AQABAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAQECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8CBgMBAQAAAAIBAwQAAAAABgIAAAAAAAYDBQEBAAAGBAgAAAAABgUAAAAA6AMAAAAAAAAGBgUBAQEBBgcEAQAAAAYICgMBAQIDBgkCBgAAAAYKAwABAQEGCwMGAQEBBgwDAAABAQAAAAA=","walletSecretId":"e051beeb-7163-4527-a5b6-35e301529ff2","useCdpSponsor":true}}}}}},"responses":{"200":{"description":"Successfully signed and sent transaction.","content":{"application/json":{"schema":{"type":"object","properties":{"transactionSignature":{"type":"string","description":"The base58 encoded transaction signature.","example":"5VERv8NMvzbJMEkV8xnrLkEaWRtSz9CosKDYjCJjBRnbJLgp8uirBgmQpjKhoR4tjF3ZpRzrFmBV6UjKdiSZkQUW"}},"required":["transactionSignature"]}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"malformed_transaction":{"value":{"errorType":"malformed_transaction","errorMessage":"Malformed unsigned transaction."}}}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"402":{"$ref":"#/components/responses/PaymentMethodRequiredError"},"403":{"$ref":"#/components/responses/DelegationForbiddenError"},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"Solana account with the given address not found."}}}}}},"422":{"$ref":"#/components/responses/IdempotencyError"},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/embedded-wallet-api/end-users/{userId}/solana/{address}/send/{asset}":{"post":{"x-audience":"public","summary":"Send USDC on Solana","description":"Sends USDC from an end user's Solana account to a recipient address on the Solana network. This endpoint simplifies USDC transfers by automatically handling mint resolution, Associated Token Account (ATA) creation, decimal conversion, and transaction encoding.\nThe `amount` field accepts human-readable amounts as decimal strings (e.g., \"1.5\", \"25.50\").\nUse the optional `createRecipientAta` parameter to control whether the sender pays for creating the recipient's Associated Token Account if it doesn't exist.","operationId":"sendSolanaAssetWithEndUserAccount","tags":["End User Accounts"],"security":[{"endUserAuth":[]},{"apiKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/XWalletAuthOptional"},{"$ref":"#/components/parameters/IdempotencyKey"},{"$ref":"#/components/parameters/XDeveloperAuth"},{"name":"userId","in":"path","required":true,"description":"The ID of the end user.","schema":{"type":"string","pattern":"^[a-zA-Z0-9-]{1,100}$"},"example":"e051beeb-7163-4527-a5b6-35e301529ff2"},{"name":"address","description":"The base58 encoded address of the Solana account to send USDC from.","in":"path","required":true,"schema":{"allOf":[{"$ref":"#/components/schemas/BlockchainAddress"}],"pattern":"^[1-9A-HJ-NP-Za-km-z]{32,44}$"},"example":"HpabPRRCFbBKSuJr5PdkVvQc85FyxyTWkFM2obBRSvHT"},{"name":"asset","in":"path","required":true,"description":"The asset to send. Currently only \"usdc\" is supported.","schema":{"allOf":[{"$ref":"#/components/schemas/Asset"}],"enum":["usdc"]},"example":"usdc"},{"$ref":"#/components/parameters/ProjectIDOptional"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"to":{"allOf":[{"$ref":"#/components/schemas/BlockchainAddress"}],"pattern":"^[1-9A-HJ-NP-Za-km-z]{32,44}$","description":"The base58 encoded address of the recipient.","example":"ExXhNkgYf6efh7YyqDRVxPZuzafobao1A74drUdp8trd"},"amount":{"type":"string","minLength":1,"maxLength":32,"description":"The amount of USDC to send as a decimal string (e.g., \"1.5\" or \"25.50\").","example":"1.50"},"network":{"type":"string","description":"The Solana network to send USDC on.","enum":["solana","solana-devnet"],"example":"solana-devnet"},"createRecipientAta":{"type":"boolean","description":"Whether to automatically create an Associated Token Account (ATA) for the recipient if it doesn't exist. When true, the sender pays the rent-exempt minimum to create the recipient's USDC ATA. When false, the transaction will fail if the recipient doesn't have a USDC ATA.","example":true},"walletSecretId":{"description":"Required when not using delegated signing. The ID of the Temporary Wallet Secret that was used to sign the X-Wallet-Auth Header.","type":"string","pattern":"^[a-zA-Z0-9-]{1,100}$","example":"e051beeb-7163-4527-a5b6-35e301529ff2"},"useCdpSponsor":{"type":"boolean","description":"Whether transaction fees should be sponsored by CDP. When true, CDP sponsors the transaction fees on behalf of the end user. When false, the end user is responsible for paying the transaction fees.","example":true}},"required":["to","amount","network"]},"examples":{"send_usdc_auto_create_ata":{"summary":"Send USDC (auto-create ATA)","value":{"to":"ExXhNkgYf6efh7YyqDRVxPZuzafobao1A74drUdp8trd","amount":"25.50","network":"solana-devnet","createRecipientAta":true,"walletSecretId":"e051beeb-7163-4527-a5b6-35e301529ff2"}},"send_usdc_no_ata_creation":{"summary":"Send USDC (no ATA creation)","value":{"to":"ExXhNkgYf6efh7YyqDRVxPZuzafobao1A74drUdp8trd","amount":"5.00","network":"solana-devnet","createRecipientAta":false,"walletSecretId":"e051beeb-7163-4527-a5b6-35e301529ff2"}},"send_usdc_sponsored":{"summary":"Send USDC with CDP gas sponsorship","value":{"to":"ExXhNkgYf6efh7YyqDRVxPZuzafobao1A74drUdp8trd","amount":"25.50","network":"solana-devnet","walletSecretId":"e051beeb-7163-4527-a5b6-35e301529ff2","useCdpSponsor":true}}}}}},"responses":{"200":{"description":"Successfully sent transaction.","content":{"application/json":{"schema":{"type":"object","properties":{"transactionSignature":{"type":"string","description":"The base58 encoded transaction signature.","example":"5VERv8NMvzbJMEkV8xnrLkEaWRtSz9CosKDYjCJjBRnbJLgp8uirBgmQpjKhoR4tjF3ZpRzrFmBV6UjKdiSZkQUW"}},"required":["transactionSignature"]},"examples":{"successful_transfer":{"value":{"transactionSignature":"5VERv8NMvzbJMEkV8xnrLkEaWRtSz9CosKDYjCJjBRnbJLgp8uirBgmQpjKhoR4tjF3ZpRzrFmBV6UjKdiSZkQUW"}}}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_amount":{"value":{"errorType":"invalid_request","errorMessage":"Invalid amount format. Amount must be a valid decimal string.","errorParam":"amount","errorLink":"https://docs.cdp.coinbase.com/api-reference/v2/errors#invalid-request"}},"invalid_network":{"value":{"errorType":"invalid_request","errorMessage":"Unsupported network for USDC transfers.","errorParam":"network","errorLink":"https://docs.cdp.coinbase.com/get-started/supported-networks#supported-networks"}},"invalid_asset":{"value":{"errorType":"invalid_request","errorMessage":"Unsupported asset. Currently only 'usdc' is supported.","errorParam":"asset","errorLink":"https://docs.cdp.coinbase.com/api-reference/v2/errors#invalid-request"}},"insufficient_balance":{"value":{"errorType":"invalid_request","errorMessage":"Account has insufficient USDC balance to complete the transfer.","errorParam":"amount","errorLink":"https://docs.cdp.coinbase.com/api-reference/v2/errors#invalid-request"}},"insufficient_sol":{"value":{"errorType":"invalid_request","errorMessage":"Account has insufficient SOL to pay for transaction fees and rent.","errorLink":"https://docs.cdp.coinbase.com/api-reference/v2/errors#invalid-request"}},"recipient_ata_missing":{"value":{"errorType":"invalid_request","errorMessage":"Recipient does not have a USDC Associated Token Account. Set 'createRecipientAta: true' to create one automatically.","errorParam":"to","errorLink":"https://docs.cdp.coinbase.com/api-reference/v2/errors#invalid-request"}}}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"402":{"$ref":"#/components/responses/PaymentMethodRequiredError"},"403":{"$ref":"#/components/responses/DelegationForbiddenError"},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"Solana account with the given address not found.","errorParam":"address","errorLink":"https://docs.cdp.coinbase.com/api-reference/v2/errors#not-found"}}}}}},"422":{"$ref":"#/components/responses/IdempotencyError"},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/evm/accounts":{"get":{"x-audience":"public","summary":"List EVM accounts","description":"Lists the EVM accounts belonging to the developer's CDP Project.\nThe response is paginated, and by default, returns 20 accounts per page.","operationId":"listEvmAccounts","tags":["EVM Accounts"],"security":[{"apiKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/PageSize"},{"$ref":"#/components/parameters/PageToken"}],"responses":{"200":{"description":"Successfully listed EVM accounts.","content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"accounts":{"type":"array","items":{"$ref":"#/components/schemas/EvmAccount"},"description":"The list of EVM accounts."}},"required":["accounts"]},{"$ref":"#/components/schemas/ListResponse"}]}}}},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}},"post":{"x-audience":"public","summary":"Create EVM account","description":"Creates a new EVM account.","operationId":"createEvmAccount","tags":["EVM Accounts"],"security":[{"apiKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/XWalletAuth"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"An optional name for the account.\nAccount names can consist of alphanumeric characters and hyphens, and be between 2 and 36 characters long.\nAccount names must be unique across all EVM accounts in the developer's CDP Project.","example":"my-wallet","pattern":"^[A-Za-z0-9][A-Za-z0-9-]{0,34}[A-Za-z0-9]$"},"accountPolicy":{"type":"string","x-audience":"public","description":"The ID of the account-level policy to apply to the account.","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","example":"123e4567-e89b-12d3-a456-426614174000"}}}}}},"responses":{"201":{"description":"Successfully created EVM account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvmAccount"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"Project has no secret. Please register a secret with the project."}}}}}},"401":{"description":"Unauthorized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"unauthorized":{"value":{"errorType":"unauthorized","errorMessage":"Wallet authentication error."}}}}}},"402":{"$ref":"#/components/responses/PaymentMethodRequiredError"},"409":{"description":"Resource already exists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"already_exists":{"value":{"errorType":"already_exists","errorMessage":"EVM account with the given name already exists."}}}}}},"422":{"$ref":"#/components/responses/IdempotencyError"},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/evm/accounts/{address}":{"get":{"x-audience":"public","summary":"Get EVM account by address","description":"Gets an EVM account by its address.","operationId":"getEvmAccount","tags":["EVM Accounts"],"security":[{"apiKeyAuth":[]}],"parameters":[{"name":"address","description":"The 0x-prefixed address of the EVM account. The address does not need to be checksummed.","in":"path","required":true,"schema":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"}],"responses":{"200":{"description":"Successfully got EVM account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvmAccount"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"request body has an error: doesn't match schema: Error at \"name\": string doesn't match the regular expression \"^[A-Za-z0-9][A-Za-z0-9-]{0,34}[A-Za-z0-9]$\"."}}}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"EVM account with the given address not found."}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}},"put":{"x-audience":"public","summary":"Update EVM account","description":"Updates an existing EVM account. Use this to update the account's name or account-level policy.","operationId":"updateEvmAccount","tags":["EVM Accounts"],"security":[{"apiKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"},{"name":"address","description":"The 0x-prefixed address of the EVM account. The address does not need to be checksummed.","in":"path","required":true,"schema":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"An optional name for the account.\nAccount names can consist of alphanumeric characters and hyphens, and be between 2 and 36 characters long.\nAccount names must be unique across all EVM accounts in the developer's CDP Project.","example":"my-wallet","pattern":"^[A-Za-z0-9][A-Za-z0-9-]{0,34}[A-Za-z0-9]$"},"accountPolicy":{"type":"string","x-audience":"public","description":"The ID of the account-level policy to apply to the account, or an empty string to unset attached policy.","pattern":"(^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)|(^$)","example":"123e4567-e89b-12d3-a456-426614174000"}}}}}},"responses":{"200":{"description":"Successfully updated EVM account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvmAccount"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"request body has an error: doesn't match schema: Error at \"/name\": string doesn't match the regular expression  \"^[A-Za-z0-9][A-Za-z0-9-]{0,34}[A-Za-z0-9]$\"."}}}}}},"404":{"description":"EVM account not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"EVM account with the given address not found."}}}}}},"409":{"$ref":"#/components/responses/AlreadyExistsError"},"422":{"$ref":"#/components/responses/IdempotencyError"},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/evm/accounts/by-name/{name}":{"get":{"x-audience":"public","summary":"Get EVM account by name","description":"Gets an EVM account by its name.","operationId":"getEvmAccountByName","tags":["EVM Accounts"],"security":[{"apiKeyAuth":[]}],"parameters":[{"name":"name","description":"The name of the EVM account.","in":"path","required":true,"schema":{"type":"string"},"example":"my-account"}],"responses":{"200":{"description":"Successfully got EVM account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvmAccount"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"error: parameter \"name\" must be a string."}}}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"EVM account with the given name not found."}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/evm/accounts/{address}/send/transaction":{"post":{"x-audience":"public","summary":"Send transaction","description":"Signs a transaction with the given EVM account and sends it to the indicated supported network. This API handles nonce management and gas estimation, leaving the developer to provide only the minimal set of fields necessary to send the transaction. The transaction should be serialized as a hex string using [RLP](https://ethereum.org/en/developers/docs/data-structures-and-encoding/rlp/).\n\nThe transaction must be an [EIP-1559 dynamic fee transaction](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1559.md).\n\n\n**Transaction fields and API behavior**\n\n- `to` *(Required)*: The address of the contract or account to send the transaction to.\n- `chainId` *(Ignored)*: The value of the `chainId` field in the transaction is ignored.\n  The transaction will be sent to the network indicated by the `network` field in the request body.\n\n- `nonce` *(Optional)*: The nonce to use for the transaction. If not provided, the API will assign\n   a nonce to the transaction based on the current state of the account.\n\n- `maxPriorityFeePerGas` *(Optional)*: The maximum priority fee per gas to use for the transaction.\n   If not provided, the API will estimate a value based on current network conditions.\n\n- `maxFeePerGas` *(Optional)*: The maximum fee per gas to use for the transaction.\n   If not provided, the API will estimate a value based on current network conditions.\n\n- `gasLimit` *(Optional)*: The gas limit to use for the transaction. If not provided, the API will estimate a value\n  based on the `to` and `data` fields of the transaction.\n\n- `value` *(Optional)*: The amount of ETH, in wei, to send with the transaction.\n- `data` *(Optional)*: The data to send with the transaction; only used for contract calls.\n- `accessList` *(Optional)*: The access list to use for the transaction.","operationId":"sendEvmTransaction","tags":["EVM Accounts"],"security":[{"apiKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/XWalletAuth"},{"$ref":"#/components/parameters/IdempotencyKey"},{"name":"address","description":"The 0x-prefixed address of the Ethereum account.","in":"path","required":true,"schema":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"network":{"type":"string","description":"The network to send the transaction to.","enum":["base","base-sepolia","ethereum","ethereum-sepolia","avalanche","polygon","optimism","arbitrum","arbitrum-sepolia","world","world-sepolia"],"example":"base-sepolia"},"transaction":{"type":"string","description":"The RLP-encoded transaction to sign and send, as a 0x-prefixed hex string.","example":"0xf86b098505d21dba00830334509431415daf58e2c6b7323b4c58712fd92952145da79018080"}},"required":["transaction","network"]}}}},"responses":{"200":{"description":"Successfully signed and sent transaction.","content":{"application/json":{"schema":{"type":"object","properties":{"transactionHash":{"type":"string","description":"The hash of the transaction, as a 0x-prefixed hex string.","example":"0xf8f98fb6726fc936f24b2007df5cb20e2b8444ff3dfaa2a929335f432a9be2e7"}},"required":["transactionHash"]}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"malformed_transaction":{"value":{"errorType":"malformed_transaction","errorMessage":"Malformed unsigned transaction."}}}}}},"401":{"description":"Unauthorized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"unauthorized":{"value":{"errorType":"unauthorized","errorMessage":"Wallet authentication error."}}}}}},"402":{"$ref":"#/components/responses/PaymentMethodRequiredError"},"403":{"description":"Access to resource forbidden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"forbidden":{"value":{"errorType":"forbidden","errorMessage":"Unable to sign transaction for this address."}}}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"EVM account with the given address not found."}}}}}},"409":{"$ref":"#/components/responses/AlreadyExistsError"},"422":{"$ref":"#/components/responses/IdempotencyError"},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/evm/accounts/{address}/sign/transaction":{"post":{"x-audience":"public","summary":"Sign transaction","description":"Signs a transaction with the given EVM account.\nThe transaction should be serialized as a hex string using [RLP](https://ethereum.org/en/developers/docs/data-structures-and-encoding/rlp/).\n\nThe transaction must be an [EIP-1559 dynamic fee transaction](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1559.md). The developer is responsible for ensuring that the unsigned transaction is valid, as the API will not validate the transaction.","operationId":"signEvmTransaction","tags":["EVM Accounts"],"security":[{"apiKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/XWalletAuth"},{"$ref":"#/components/parameters/IdempotencyKey"},{"name":"address","description":"The 0x-prefixed address of the EVM account.","in":"path","required":true,"schema":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"transaction":{"type":"string","description":"The RLP-encoded transaction to sign, as a 0x-prefixed hex string.","example":"0xf86b098505d21dba00830334509431415daf58e2c6b7323b4c58712fd92952145da79018080"}},"required":["transaction"]}}}},"responses":{"200":{"description":"Successfully signed transaction.","content":{"application/json":{"schema":{"type":"object","properties":{"signedTransaction":{"type":"string","description":"The RLP-encoded signed transaction, as a 0x-prefixed hex string.","example":"0x1b0c9cf8cd4554c6c6d9e7311e88f1be075d7f25b418a044f4bf2c0a42a93e212ad0a8b54de9e0b5f7e3812de3f2c6cc79aa8c3e1c02e7ad14b4a8f42012c2c01b"}},"required":["signedTransaction"]}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"malformed_transaction":{"value":{"errorType":"malformed_transaction","errorMessage":"Malformed unsigned transaction."}}}}}},"401":{"description":"Unauthorized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"unauthorized":{"value":{"errorType":"unauthorized","errorMessage":"Wallet authentication error."}}}}}},"402":{"$ref":"#/components/responses/PaymentMethodRequiredError"},"403":{"description":"Access to resource forbidden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"forbidden":{"value":{"errorType":"forbidden","errorMessage":"Unable to sign transaction for this address."}}}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"EVM account with the given address not found."}}}}}},"409":{"$ref":"#/components/responses/AlreadyExistsError"},"422":{"$ref":"#/components/responses/IdempotencyError"},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/evm/accounts/{address}/sign":{"post":{"x-audience":"public","summary":"Sign hash","description":"Signs an arbitrary 32 byte hash with the given EVM account.","operationId":"signEvmHash","tags":["EVM Accounts"],"security":[{"apiKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/XWalletAuth"},{"$ref":"#/components/parameters/IdempotencyKey"},{"name":"address","description":"The 0x-prefixed address of the EVM account.","in":"path","required":true,"schema":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"hash":{"type":"string","description":"The arbitrary 32 byte hash to sign.","example":"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"}},"required":["hash"]}}}},"responses":{"200":{"description":"Successfully signed hash.","content":{"application/json":{"schema":{"type":"object","properties":{"signature":{"type":"string","description":"The signature of the hash, as a 0x-prefixed hex string.","example":"0x1b0c9cf8cd4554c6c6d9e7311e88f1be075d7f25b418a044f4bf2c0a42a93e212ad0a8b54de9e0b5f7e3812de3f2c6cc79aa8c3e1c02e7ad14b4a8f42012c2c01b"}},"required":["signature"]}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"Request body must be specified."}}}}}},"402":{"$ref":"#/components/responses/PaymentMethodRequiredError"},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"EVM account with the given address not found."}}}}}},"409":{"$ref":"#/components/responses/AlreadyExistsError"},"422":{"$ref":"#/components/responses/IdempotencyError"},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/evm/accounts/{address}/sign/message":{"post":{"x-audience":"public","summary":"Sign EIP-191 message","description":"Signs an [EIP-191](https://eips.ethereum.org/EIPS/eip-191) message with the given EVM account.\n\nPer the specification, the message in the request body is prepended with `0x19 <0x45 (E)> <thereum Signed Message:\\n\" + len(message)>` before being signed.","operationId":"signEvmMessage","tags":["EVM Accounts"],"security":[{"apiKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/XWalletAuth"},{"$ref":"#/components/parameters/IdempotencyKey"},{"name":"address","description":"The 0x-prefixed address of the EVM account.","in":"path","required":true,"schema":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"The message to sign.","example":"Hello, world!"}},"required":["message"]}}}},"responses":{"200":{"description":"Successfully signed message.","content":{"application/json":{"schema":{"type":"object","properties":{"signature":{"type":"string","description":"The signature of the message, as a 0x-prefixed hex string.","example":"0x1b0c9cf8cd4554c6c6d9e7311e88f1be075d7f25b418a044f4bf2c0a42a93e212ad0a8b54de9e0b5f7e3812de3f2c6cc79aa8c3e1c02e7ad14b4a8f42012c2c01b"}},"required":["signature"]}}}},"401":{"description":"Unauthorized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"unauthorized":{"value":{"errorType":"unauthorized","errorMessage":"Wallet authentication error."}}}}}},"402":{"$ref":"#/components/responses/PaymentMethodRequiredError"},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"EVM account with the given address not found."}}}}}},"409":{"$ref":"#/components/responses/AlreadyExistsError"},"422":{"$ref":"#/components/responses/IdempotencyError"},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/evm/accounts/{address}/sign/typed-data":{"post":{"x-audience":"public","summary":"Sign EIP-712 typed data","description":"Signs [EIP-712](https://eips.ethereum.org/EIPS/eip-712) typed data with the given EVM account.","operationId":"signEvmTypedData","tags":["EVM Accounts"],"security":[{"apiKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/XWalletAuth"},{"$ref":"#/components/parameters/IdempotencyKey"},{"name":"address","description":"The 0x-prefixed address of the EVM account.","in":"path","required":true,"schema":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EIP712Message"}}}},"responses":{"200":{"description":"Successfully signed typed data.","content":{"application/json":{"schema":{"type":"object","properties":{"signature":{"type":"string","description":"The signature of the typed data, as a 0x-prefixed hex string.","example":"0x1b0c9cf8cd4554c6c6d9e7311e88f1be075d7f25b418a044f4bf2c0a42a93e212ad0a8b54de9e0b5f7e3812de3f2c6cc79aa8c3e1c02e7ad14b4a8f42012c2c01b"}},"required":["signature"]}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"Invalid request. Please check the request body and parameters."}}}}}},"401":{"description":"Unauthorized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"unauthorized":{"value":{"errorType":"unauthorized","errorMessage":"Wallet authentication error."}}}}}},"402":{"$ref":"#/components/responses/PaymentMethodRequiredError"},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"EVM account with the given address not found."}}}}}},"422":{"$ref":"#/components/responses/IdempotencyError"},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/evm/accounts/{address}/eip7702/delegation":{"post":{"x-audience":"public","summary":"Create EIP-7702 delegation","description":"Creates an EIP-7702 delegation for an EVM EOA account, upgrading it with smart account capabilities.\n\nThis endpoint:\n- Retrieves delegation artifacts from onchain\n- Signs the EIP-7702 authorization for delegation\n- Assembles and submits a Type 4 transaction\n- Creates an associated smart account object\n\nThe delegation allows the EVM EOA to be used as a smart account, which enables batched transactions and gas sponsorship via paymaster.","operationId":"createEvmEip7702Delegation","tags":["EVM Accounts"],"security":[{"apiKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/XWalletAuth"},{"$ref":"#/components/parameters/IdempotencyKey"},{"name":"address","description":"The 0x-prefixed address of the EVM account to delegate.","in":"path","required":true,"schema":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"network":{"$ref":"#/components/schemas/EvmEip7702DelegationNetwork"},"enableSpendPermissions":{"type":"boolean","description":"Whether to configure spend permissions for the upgraded, delegated account. When enabled, the account can grant permissions for third parties to spend on its behalf.","default":false,"example":true}},"required":["network"]}}}},"responses":{"201":{"description":"Delegation operation created successfully.","content":{"application/json":{"schema":{"type":"object","properties":{"delegationOperationId":{"type":"string","format":"uuid","description":"The unique identifier for the delegation operation. Use this to poll the operation status.","example":"a1b2c3d4-e5f6-7890-abcd-ef1234567890"}},"required":["delegationOperationId"]}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"missing_network":{"value":{"errorType":"invalid_request","errorMessage":"Field 'network' is required.","errorParam":"network","errorLink":"https://docs.cdp.coinbase.com/api-reference/v2/errors#invalid-request"}},"unsupported_network":{"value":{"errorType":"invalid_request","errorMessage":"Network 'gnosis' is not supported for EIP-7702.","errorParam":"network","errorLink":"https://docs.cdp.coinbase.com/api-reference/v2/errors#invalid-request"}}}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"402":{"$ref":"#/components/responses/PaymentMethodRequiredError"},"404":{"description":"EVM account not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"EVM account with the given address not found.","errorParam":"address","errorLink":"https://docs.cdp.coinbase.com/api-reference/v2/errors#not-found"}}}}}},"409":{"description":"Account already delegated on the given network.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"already_delegated":{"value":{"errorType":"already_exists","errorMessage":"Account already has an active EIP-7702 delegation on the given network.","errorParam":"address","errorLink":"https://docs.cdp.coinbase.com/api-reference/v2/errors#already-exists"}}}}}},"422":{"$ref":"#/components/responses/IdempotencyError"},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/evm/eip7702/delegation-operations/{delegationOperationId}":{"get":{"x-audience":"public","summary":"Get EIP-7702 delegation operation by ID","description":"Returns the EIP-7702 delegation operation. Use the delegationOperationId returned by the Create EIP-7702 delegation endpoint to poll for operation completion.","operationId":"getEvmEip7702DelegationOperationById","tags":["EVM Accounts"],"security":[{"apiKeyAuth":[]}],"parameters":[{"name":"delegationOperationId","description":"The unique identifier for the delegation operation.","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[a-f0-9\\-]{36}$"},"example":"a1b2c3d4-e5f6-7890-abcd-ef1234567890"}],"responses":{"200":{"description":"Delegation operation retrieved successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvmEip7702DelegationOperation"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_id":{"value":{"errorType":"invalid_request","errorMessage":"Invalid delegation operation ID format.","errorParam":"delegationOperationId","errorLink":"https://docs.cdp.coinbase.com/api-reference/v2/errors#invalid-request"}}}}}},"404":{"description":"Delegation operation not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"Delegation operation not found.","errorParam":"delegationOperationId","errorLink":"https://docs.cdp.coinbase.com/api-reference/v2/errors#not-found"}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/evm/smart-accounts":{"get":{"summary":"List Smart Accounts","description":"Lists the Smart Accounts belonging to the developer's CDP Project.\nThe response is paginated, and by default, returns 20 accounts per page.","operationId":"listEvmSmartAccounts","tags":["EVM Smart Accounts"],"security":[{"apiKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/PageSize"},{"$ref":"#/components/parameters/PageToken"}],"responses":{"200":{"description":"Successfully listed Smart Accounts.","content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"accounts":{"type":"array","items":{"$ref":"#/components/schemas/EvmSmartAccount"},"description":"The list of Smart Accounts."}},"required":["accounts"]},{"$ref":"#/components/schemas/ListResponse"}]}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"Invalid request. Please check the request body and parameters."}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}},"post":{"summary":"Create Smart Account","description":"Creates a new Smart Account.","operationId":"createEvmSmartAccount","tags":["EVM Smart Accounts"],"security":[{"apiKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"owners":{"type":"array","description":"Today, only a single owner can be set for a Smart Account, but this is an array to allow setting multiple owners in the future.","items":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"example":["0xfc807D1bE4997e5C7B33E4d8D57e60c5b0f02B1a"]},"name":{"type":"string","description":"An optional name for the account.\nAccount names can consist of alphanumeric characters and hyphens, and be between 2 and 36 characters long.\nAccount names must be unique across all EVM accounts in the developer's CDP Project.","example":"my-smart-wallet","pattern":"^[A-Za-z0-9][A-Za-z0-9-]{0,34}[A-Za-z0-9]$"}},"required":["owners"]}}}},"responses":{"201":{"description":"Successfully created Smart Account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvmSmartAccount"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"Invalid owner address or account name provided."}}}}}},"402":{"$ref":"#/components/responses/PaymentMethodRequiredError"},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/evm/smart-accounts/by-name/{name}":{"get":{"x-audience":"public","summary":"Get Smart Account by name","description":"Gets a Smart Account by its name.","operationId":"getEvmSmartAccountByName","security":[{"apiKeyAuth":[]}],"tags":["EVM Smart Accounts"],"parameters":[{"name":"name","description":"The name of the Smart Account.","in":"path","required":true,"schema":{"type":"string"},"example":"my-account"}],"responses":{"200":{"description":"Successfully got Smart Account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvmSmartAccount"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"error: parameter \"name\" must be a string."}}}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"Smart Account with the given name not found."}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/evm/accounts/import":{"post":{"x-audience":"public","summary":"Import EVM account","description":"Import an existing EVM account into the developer's CDP Project. This API should be called from the [CDP SDK](https://github.com/coinbase/cdp-sdk) to ensure that the associated private key is properly encrypted.","operationId":"importEvmAccount","tags":["EVM Accounts"],"security":[{"apiKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/XWalletAuth"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"encryptedPrivateKey":{"type":"string","description":"The base64-encoded, encrypted private key of the EVM account. The private key must be encrypted using the CDP SDK's encryption scheme.","example":"U2FsdGVkX1+vupppZksvRf5X5YgHq4+da+Q4qf51+Q4="},"name":{"type":"string","description":"An optional name for the account.\nAccount names can consist of alphanumeric characters and hyphens, and be between 2 and 36 characters long.\nAccount names must be unique across all EVM accounts in the developer's CDP Project.","example":"my-wallet","pattern":"^[A-Za-z0-9][A-Za-z0-9-]{0,34}[A-Za-z0-9]$"},"accountPolicy":{"type":"string","x-audience":"public","description":"The ID of the account-level policy to apply to the account.","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","example":"123e4567-e89b-12d3-a456-426614174000"}},"required":["encryptedPrivateKey"]}}}},"responses":{"201":{"description":"Successfully imported EVM account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvmAccount"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"The encrypted private key is invalid."}}}}}},"401":{"description":"Unauthorized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"unauthorized":{"value":{"errorType":"unauthorized","errorMessage":"Wallet authentication error."}}}}}},"402":{"$ref":"#/components/responses/PaymentMethodRequiredError"},"409":{"description":"Resource already exists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"already_exists":{"value":{"errorType":"already_exists","errorMessage":"EVM account with the given address already exists."}}}}}},"422":{"$ref":"#/components/responses/IdempotencyError"},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/evm/accounts/{address}/export":{"post":{"x-audience":"public","summary":"Export EVM account","description":"Export an existing EVM account's private key. It is important to store the private key in a secure place after it's exported.","operationId":"exportEvmAccount","tags":["EVM Accounts"],"security":[{"apiKeyAuth":[]}],"x-required-api-auth-scopes":["accounts#export"],"parameters":[{"$ref":"#/components/parameters/XWalletAuth"},{"$ref":"#/components/parameters/IdempotencyKey"},{"name":"address","description":"The 0x-prefixed address of the EVM account. The address does not need to be checksummed.","in":"path","required":true,"schema":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"exportEncryptionKey":{"type":"string","description":"The base64-encoded, public part of the RSA key in DER format used to encrypt the account private key.","example":"U2FsdGVkX1+vupppZksvRf5X5YgHq4+da+Q4qf51+Q4="}},"required":["exportEncryptionKey"]}}}},"responses":{"200":{"description":"Successfully exported EVM account.","content":{"application/json":{"schema":{"type":"object","properties":{"encryptedPrivateKey":{"type":"string","description":"The base64-encoded, encrypted private key of the EVM account which is a 32 byte raw private key. The private key is encrypted in transport using the exportEncryptionKey in the request.","example":"U2FsdGVkX1+vupppZksvRf5X5YgHq4+da+Q4qf51+Q4="}},"required":["encryptedPrivateKey"]}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"EVM account with the given address not found."}}}}}},"401":{"description":"Unauthorized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"unauthorized":{"value":{"errorType":"unauthorized","errorMessage":"Wallet authentication error."}}}}}},"402":{"$ref":"#/components/responses/PaymentMethodRequiredError"},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"EVM account with the given address not found."}}}}}},"422":{"$ref":"#/components/responses/IdempotencyError"},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/evm/accounts/export/by-name/{name}":{"post":{"x-audience":"public","summary":"Export EVM account by name","description":"Export an existing EVM account's private key by its name. It is important to store the private key in a secure place after it's exported.","operationId":"exportEvmAccountByName","tags":["EVM Accounts"],"security":[{"apiKeyAuth":[]}],"x-required-api-auth-scopes":["accounts#export"],"parameters":[{"$ref":"#/components/parameters/XWalletAuth"},{"$ref":"#/components/parameters/IdempotencyKey"},{"name":"name","description":"The name of the EVM account.","in":"path","required":true,"schema":{"type":"string"},"example":"my-account"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"exportEncryptionKey":{"type":"string","description":"The base64-encoded, public part of the RSA key in DER format used to encrypt the account private key.","example":"U2FsdGVkX1+vupppZksvRf5X5YgHq4+da+Q4qf51+Q4="}},"required":["exportEncryptionKey"]}}}},"responses":{"200":{"description":"Successfully exported EVM account.","content":{"application/json":{"schema":{"type":"object","properties":{"encryptedPrivateKey":{"type":"string","description":"The base64-encoded, encrypted private key of the EVM account which is a 32 byte raw private key. The private key is encrypted in transport using the exportEncryptionKey in the request.","example":"U2FsdGVkX1+vupppZksvRf5X5YgHq4+da+Q4qf51+Q4="}},"required":["encryptedPrivateKey"]}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"error: parameter \"name\" must be a string."}}}}}},"401":{"description":"Unauthorized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"unauthorized":{"value":{"errorType":"unauthorized","errorMessage":"Wallet authentication error."}}}}}},"402":{"$ref":"#/components/responses/PaymentMethodRequiredError"},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"EVM account with the given name not found."}}}}}},"422":{"$ref":"#/components/responses/IdempotencyError"},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/evm/smart-accounts/{address}":{"get":{"summary":"Get Smart Account by address","description":"Gets a Smart Account by its address.","operationId":"getEvmSmartAccount","tags":["EVM Smart Accounts"],"security":[{"apiKeyAuth":[]}],"parameters":[{"name":"address","description":"The 0x-prefixed address of the Smart Account.","in":"path","required":true,"schema":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"}],"responses":{"200":{"description":"Successfully got Smart Account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvmSmartAccount"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"Invalid address provided."}}}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"Smart Account with the given address not found."}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}},"put":{"x-audience":"public","summary":"Update EVM Smart Account","description":"Updates an existing EVM smart account. Use this to update the smart account's name.","operationId":"updateEvmSmartAccount","tags":["EVM Smart Accounts"],"security":[{"apiKeyAuth":[]}],"parameters":[{"name":"address","description":"The 0x-prefixed address of the EVM smart account. The address does not need to be checksummed.","in":"path","required":true,"schema":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"An optional name for the smart account.\nAccount names can consist of alphanumeric characters and hyphens, and be between 2 and 36 characters long.\nAccount names must be unique across all EVM smart accounts in the developer's CDP Project.","example":"my-smart-account","pattern":"^[A-Za-z0-9][A-Za-z0-9-]{0,34}[A-Za-z0-9]$"}}}}}},"responses":{"200":{"description":"Successfully updated EVM smart account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvmSmartAccount"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"request body has an error: doesn't match schema: Error at \"/name\": string doesn't match the regular expression  \"^[A-Za-z0-9][A-Za-z0-9-]{0,34}[A-Za-z0-9]$\"."}}}}}},"404":{"description":"EVM account not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"EVM smart account with the given address not found."}}}}}},"409":{"$ref":"#/components/responses/AlreadyExistsError"},"422":{"$ref":"#/components/responses/IdempotencyError"},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/evm/smart-accounts/{address}/user-operations":{"post":{"summary":"Prepare user operation","description":"Prepares a new user operation on a Smart Account for a specific network.","operationId":"prepareUserOperation","tags":["EVM Smart Accounts"],"security":[{"apiKeyAuth":[]}],"parameters":[{"name":"address","description":"The address of the Smart Account to create the user operation on.","in":"path","required":true,"schema":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"network":{"$ref":"#/components/schemas/EvmUserOperationNetwork"},"calls":{"type":"array","description":"The list of calls to make from the Smart Account.","items":{"$ref":"#/components/schemas/EvmCall"}},"paymasterUrl":{"allOf":[{"$ref":"#/components/schemas/Url"}],"description":"The URL of the paymaster to use for the user operation.","example":"https://api.developer.coinbase.com/rpc/v1/base/<token>"},"paymasterContext":{"$ref":"#/components/schemas/PaymasterContext"},"dataSuffix":{"type":"string","pattern":"^0x[0-9a-fA-F]+$","description":"The EIP-8021 data suffix (hex-encoded) that enables transaction attribution for the user operation.","example":"0xdddddddd62617365617070070080218021802180218021802180218021"}},"required":["network","calls"]}}}},"responses":{"201":{"description":"The prepared user operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvmUserOperation"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"Field \"network\" is required."}},"paymaster_context_without_paymaster":{"value":{"errorType":"invalid_request","errorMessage":"paymasterContext requires a paymaster: set paymasterUrl."}}}}}},"403":{"description":"Access to resource forbidden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"forbidden":{"value":{"errorType":"forbidden","errorMessage":"Unable to sign transaction for this address."}}}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"EVM smart account with the given address not found."}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/evm/smart-accounts/{address}/user-operations/prepare-and-send":{"post":{"x-audience":"public","summary":"Prepare and send user operation","description":"Prepares, signs, and sends a user operation for an EVM Smart Account. This API can be used only if the owner on Smart Account is a CDP EVM Account.","operationId":"prepareAndSendUserOperation","tags":["EVM Smart Accounts"],"security":[{"apiKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"},{"$ref":"#/components/parameters/XWalletAuth"},{"name":"address","description":"The address of the EVM Smart Account to execute the user operation from.","in":"path","required":true,"schema":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"network":{"$ref":"#/components/schemas/EvmUserOperationNetwork"},"calls":{"type":"array","description":"The list of calls to make from the Smart Account.","items":{"$ref":"#/components/schemas/EvmCall"}},"paymasterUrl":{"allOf":[{"$ref":"#/components/schemas/Url"}],"description":"The URL of the paymaster to use for the user operation.","example":"https://api.developer.coinbase.com/rpc/v1/base/<token>"},"paymasterContext":{"$ref":"#/components/schemas/PaymasterContext"}},"required":["network","calls"]}}}},"responses":{"200":{"description":"The user operation was successfully prepared, signed, and sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvmUserOperation"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"Field \"network\" is required."}},"paymaster_context_without_paymaster":{"value":{"errorType":"invalid_request","errorMessage":"paymasterContext requires a paymaster: set paymasterUrl."}},"invalid_signature":{"value":{"errorType":"invalid_signature","errorMessage":"Failed to sign user operation."}}}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"402":{"$ref":"#/components/responses/PaymentMethodRequiredError"},"403":{"description":"Access to resource forbidden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"forbidden":{"value":{"errorType":"forbidden","errorMessage":"Unable to sign transaction for this address."}}}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"End user Smart Account with the given address not found."}}}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"rate_limit_exceeded":{"value":{"errorType":"rate_limit_exceeded","errorMessage":"Max concurrent user operations reached."}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/evm/smart-accounts/{address}/user-operations/{userOpHash}":{"get":{"summary":"Get user operation","description":"Gets a user operation by its hash.","operationId":"getUserOperation","tags":["EVM Smart Accounts"],"security":[{"apiKeyAuth":[]}],"parameters":[{"name":"address","description":"The address of the Smart Account the user operation belongs to.","in":"path","required":true,"schema":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"},{"name":"userOpHash","description":"The hash of the user operation to fetch.","in":"path","required":true,"schema":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"example":"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"}],"responses":{"200":{"description":"Successfully retrieved the user operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvmUserOperation"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"Invalid request. Please check the request body and parameters."}}}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"User operation not found."}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/evm/smart-accounts/{address}/user-operations/{userOpHash}/send":{"post":{"summary":"Send user operation","description":"Sends a user operation with a signature.\nThe payload to sign must be the `userOpHash` field of the user operation. This hash should be signed directly (not using `personal_sign` or EIP-191 message hashing).\nThe signature must be 65 bytes in length, consisting of: - 32 bytes for the `r` value - 32 bytes for the `s` value - 1 byte for the `v` value (must be 27 or 28)\nIf using the CDP Paymaster, the user operation must be signed and sent within 2 minutes of being prepared.","operationId":"sendUserOperation","tags":["EVM Smart Accounts"],"security":[{"apiKeyAuth":[]}],"parameters":[{"name":"address","description":"The address of the Smart Account to send the user operation from.","in":"path","required":true,"schema":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"},{"name":"userOpHash","description":"The hash of the user operation to send.","in":"path","required":true,"schema":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"example":"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"signature":{"type":"string","description":"The hex-encoded signature of the user operation. This should be a 65-byte signature consisting of the `r`, `s`, and `v` values of the ECDSA signature. Note that the `v` value should conform to the `personal_sign` standard, which means it should be 27 or 28.","example":"0x1b0c9cf8cd4554c6c6d9e7311e88f1be075d7f25b418a044f4bf2c0a42a93e212ad0a8b54de9e0b5f7e3812de3f2c6cc79aa8c3e1c02e7ad14b4a8f42012c2c01b"}},"required":["signature"]}}}},"responses":{"200":{"description":"The sent user operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvmUserOperation"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_signature":{"value":{"errorType":"invalid_signature","errorMessage":"Invalid signature."}}}}}},"402":{"$ref":"#/components/responses/PaymentMethodRequiredError"},"403":{"description":"Access to resource forbidden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"forbidden":{"value":{"errorType":"forbidden","errorMessage":"Unable to sign transaction for this address."}}}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"User operation not found."}}}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"rate_limit_exceeded":{"value":{"errorType":"rate_limit_exceeded","errorMessage":"Max concurrent user operations reached."}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/evm/smart-accounts/{address}/spend-permissions":{"post":{"x-audience":"public","summary":"Create spend permission","description":"Creates a spend permission for the given smart account address.","operationId":"createSpendPermission","tags":["EVM Smart Accounts"],"security":[{"apiKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/XWalletAuth"},{"$ref":"#/components/parameters/IdempotencyKey"},{"name":"address","description":"The address of the Smart Account to create the spend permission for.","in":"path","required":true,"schema":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSpendPermissionRequest"}}}},"responses":{"200":{"description":"Successfully created spend permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvmUserOperation"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"Invalid request. Please check the request body and parameters."}}}}}},"402":{"$ref":"#/components/responses/PaymentMethodRequiredError"},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"Smart account not found."}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/evm/smart-accounts/{address}/spend-permissions/list":{"get":{"x-audience":"public","summary":"List spend permissions","description":"Lists spend permission for the given smart account address.","operationId":"listSpendPermissions","tags":["EVM Smart Accounts"],"security":[{"apiKeyAuth":[]}],"parameters":[{"name":"address","description":"The address of the Smart account to list spend permissions for.","in":"path","required":true,"schema":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"},{"name":"pageSize","description":"The number of spend permissions to return per page.","in":"query","required":false,"schema":{"type":"integer","default":20},"example":10},{"name":"pageToken","description":"The token for the next page of spend permissions. Will be empty if there are no more spend permissions to fetch.","in":"query","required":false,"schema":{"type":"string"},"example":"eyJsYXN0X2lkIjogImFiYzEyMyIsICJ0aW1lc3RhbXAiOiAxNzA3ODIzNzAxfQ=="}],"responses":{"200":{"description":"Successfully listed spend permissions.","content":{"application/json":{"schema":{"allOf":[{"type":"object","required":["spendPermissions"],"properties":{"spendPermissions":{"type":"array","description":"The spend permissions for the smart account.","items":{"$ref":"#/components/schemas/SpendPermissionResponseObject"}}}},{"$ref":"#/components/schemas/ListResponse"}]}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"Invalid request. Please check the request body and parameters."}}}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"Smart account not found."}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/evm/smart-accounts/{address}/spend-permissions/revoke":{"post":{"x-audience":"public","summary":"Revoke spend permission","description":"Revokes an existing spend permission.","operationId":"revokeSpendPermission","tags":["EVM Smart Accounts"],"security":[{"apiKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/XWalletAuth"},{"$ref":"#/components/parameters/IdempotencyKey"},{"name":"address","description":"The address of the Smart account this spend permission is valid for.","in":"path","required":true,"schema":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevokeSpendPermissionRequest"}}}},"responses":{"200":{"description":"Successfully revoked spend permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvmUserOperation"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"Invalid request. Please check the request body and parameters."}}}}}},"402":{"$ref":"#/components/responses/PaymentMethodRequiredError"},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"Smart account not found."}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/evm/swaps/quote":{"get":{"x-audience":"public","summary":"Get swap price estimate","description":"Get a price estimate for a swap between two tokens on an EVM network.","operationId":"getEvmSwapPrice","tags":["EVM Swaps"],"security":[{"apiKeyAuth":[]}],"parameters":[{"in":"query","name":"network","required":true,"schema":{"$ref":"#/components/schemas/EvmSwapsNetwork"}},{"in":"query","name":"toToken","required":true,"schema":{"$ref":"#/components/schemas/toToken"}},{"in":"query","name":"fromToken","required":true,"schema":{"$ref":"#/components/schemas/fromToken"}},{"in":"query","name":"fromAmount","required":true,"schema":{"$ref":"#/components/schemas/fromAmount"}},{"in":"query","name":"taker","required":true,"schema":{"$ref":"#/components/schemas/taker"}},{"in":"query","name":"signerAddress","required":false,"schema":{"$ref":"#/components/schemas/signerAddress"}},{"in":"query","name":"gasPrice","required":false,"schema":{"$ref":"#/components/schemas/gasPrice"}},{"in":"query","name":"slippageBps","required":false,"schema":{"$ref":"#/components/schemas/slippageBps"}}],"responses":{"200":{"description":"A price estimate for the swap.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetSwapPriceResponseWrapper"},"examples":{"success":{"summary":"Successful swap price retrieval","value":{"blockNumber":"17038723","toAmount":"1000000000000000000","toToken":"0x7F5c764cBc14f9669B88837ca1490cCa17c31607","fees":{"gasFee":{"amount":"1000000000000000000","token":"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"},"protocolFee":{"amount":"1000000000000000000","token":"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"}},"issues":{"allowance":{"currentAllowance":"1000000000","spender":"0x000000000022D473030F116dDEE9F6B43aC78BA3"},"balance":{"token":"0x6B175474E89094C44Da98b954EedeAC495271d0F","currentBalance":"1000000000000000000","requiredBalance":"1000000000000000000"},"simulationIncomplete":false},"liquidityAvailable":true,"minToAmount":"900000000000000000","fromAmount":"1000000000000000000","fromToken":"0x6B175474E89094C44Da98b954EedeAC495271d0F","gas":"100000","gasPrice":"1000000000"}},"unavailable":{"summary":"Swap with unavailable liquidity","value":{"liquidityAvailable":false}}}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"Invalid request. Please check the request body and parameters."}}}}}},"403":{"description":"Taker not permitted to perform swap.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"forbidden":{"value":{"errorType":"forbidden","errorMessage":"Taker not permitted to perform swap."}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/evm/swaps":{"post":{"x-audience":"public","summary":"Create swap quote","description":"Create a swap quote, which includes the payload to sign as well as the transaction data needed to execute the swap. The developer is responsible for signing the payload and submitting the transaction to the network in order to execute the swap.","operationId":"createEvmSwapQuote","tags":["EVM Swaps"],"security":[{"apiKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"network":{"$ref":"#/components/schemas/EvmSwapsNetwork"},"toToken":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$","description":"The 0x-prefixed contract address of the token to receive.","example":"0x7F5c764cBc14f9669B88837ca1490cCa17c31607"},"fromToken":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$","description":"The 0x-prefixed contract address of the token to send.","example":"0x6B175474E89094C44Da98b954EedeAC495271d0F"},"fromAmount":{"type":"string","pattern":"^\\d+$","description":"The amount of the `fromToken` to send in atomic units of the token. For example, `1000000000000000000` when sending ETH equates to 1 ETH, `1000000` when sending USDC equates to 1 USDC, etc.","example":"1000000000000000000"},"taker":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$","description":"The 0x-prefixed address that holds the `fromToken` balance and has the `Permit2` allowance set for the swap.","example":"0xAc0974bec39a17e36ba4a6b4d238ff944bacb478"},"signerAddress":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$","description":"The 0x-prefixed Externally Owned Account (EOA) address that will sign the `Permit2` EIP-712 permit message. This is only needed if `taker` is a smart contract.","example":"0x922f49447d8a07e3bd95bd0d56f35241523fbab8"},"gasPrice":{"type":"string","pattern":"^\\d+$","description":"The target gas price for the swap transaction, in Wei. For EIP-1559 transactions, this value should be seen as the `maxFeePerGas` value. If not provided, the API will use an estimate based on the current network conditions.","example":"1000000000"},"slippageBps":{"type":"integer","minimum":0,"maximum":10000,"description":"The maximum acceptable slippage of the `toToken` in basis points. If this parameter is set to 0, no slippage will be tolerated. If not provided, the default slippage tolerance is 100 bps (i.e., 1%).","default":100,"example":100}},"required":["network","toToken","fromToken","fromAmount","taker"]}}}},"responses":{"201":{"description":"Successfully created swap quote.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSwapQuoteResponseWrapper"},"examples":{"success":{"summary":"Successful swap quote creation","value":{"blockNumber":"17038723","toAmount":"1000000000000000000","toToken":"0x7F5c764cBc14f9669B88837ca1490cCa17c31607","fees":{"gasFee":{"amount":"1000000000000000000","token":"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"},"protocolFee":{"amount":"1000000000000000000","token":"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"}},"issues":{"allowance":{"currentAllowance":"1000000000","spender":"0x000000000022D473030F116dDEE9F6B43aC78BA3"},"balance":{"token":"0x6B175474E89094C44Da98b954EedeAC495271d0F","currentBalance":"1000000000000000000","requiredBalance":"1000000000000000000"},"simulationIncomplete":false},"liquidityAvailable":true,"minToAmount":"900000000000000000","fromAmount":"1000000000000000000","fromToken":"0x6B175474E89094C44Da98b954EedeAC495271d0F","permit2":{"hash":"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef","eip712":{"domain":{"name":"Permit2","chainId":1,"verifyingContract":"0x000000000022D473030F116dDEE9F6B43aC78BA3"},"types":{"EIP712Domain":[{"name":"name","type":"string"},{"name":"chainId","type":"uint256"},{"name":"verifyingContract","type":"address"}],"PermitTransferFrom":[{"name":"permitted","type":"TokenPermissions"},{"name":"spender","type":"address"},{"name":"nonce","type":"uint256"},{"name":"deadline","type":"uint256"}],"TokenPermissions":[{"name":"token","type":"address"},{"name":"amount","type":"uint256"}]},"primaryType":"PermitTransferFrom","message":{"permitted":{"token":"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48","amount":"1000000"},"spender":"0xFfFfFfFFfFFfFFfFFfFFFFFffFFFffffFfFFFfFf","nonce":"123456","deadline":"1717123200"}}},"transaction":{"to":"0x000000000022D473030F116dDEE9F6B43aC78BA3","data":"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef","gas":"100000","gasPrice":"1000000000","value":"1000000000000000000"}}},"unavailable":{"summary":"Swap with unavailable liquidity","value":{"liquidityAvailable":false}}}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"Invalid request. Please check the request body and parameters."}}}}}},"403":{"description":"Taker not permitted to perform swap.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"forbidden":{"value":{"errorType":"forbidden","errorMessage":"Taker not permitted to perform swap."}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/evm/token-balances/{network}/{address}":{"get":{"x-audience":"public","summary":"List EVM token balances","description":"Lists the token balances of an EVM address on a given network. The balances include ERC-20 tokens and the native gas token (usually ETH). The response is paginated, and by default, returns 20 balances per page.\n**Note:** This endpoint is still under development and does not yet provide strong freshness guarantees. Specifically, balances of new tokens can, on occasion, take up to ~30 seconds to appear, while balances of tokens already belonging to an address will generally be close to chain tip. Freshness of new token balances will improve over the coming weeks.","operationId":"listEvmTokenBalances","tags":["EVM Token Balances"],"security":[{"apiKeyAuth":[]}],"parameters":[{"name":"address","description":"The 0x-prefixed EVM address to get balances for. The address does not need to be checksummed.","in":"path","required":true,"schema":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"},{"name":"network","description":"The human-readable network name to get the balances for.","in":"path","required":true,"schema":{"$ref":"#/components/schemas/ListEvmTokenBalancesNetwork"},"example":"base"},{"$ref":"#/components/parameters/PageSize"},{"$ref":"#/components/parameters/PageToken"}],"responses":{"200":{"description":"Successfully listed token balances.","content":{"application/json":{"schema":{"allOf":[{"type":"object","required":["balances"],"properties":{"balances":{"type":"array","items":{"$ref":"#/components/schemas/TokenBalance"},"description":"The list of EVM token balances.","example":[{"amount":{"amount":"1250000000000000000","decimals":18},"token":{"network":"base","symbol":"ETH","name":"ether","contractAddress":"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"}},{"amount":{"amount":"123456","decimals":6},"token":{"network":"base","symbol":"USDC","name":"USD Coin","contractAddress":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}}]}}},{"$ref":"#/components/schemas/ListResponse"}]}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"string doesn't match the regular expression \"^0x[0-9a-fA-F]{40}$\"."}}}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"Address not found, or no balances found for the given address on this chain."}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/evm/faucet":{"post":{"x-audience":"public","summary":"Request funds on EVM test networks","description":"Request funds from the CDP Faucet on supported EVM test networks.\n\nFaucets are available for ETH, USDC, EURC, and cbBTC on Base Sepolia and Ethereum Sepolia, and for ETH only on Ethereum Hoodi.\n\nTo prevent abuse, we enforce rate limits within a rolling 24-hour window to control the amount of funds that can be requested.\nThese limits are applied at both the CDP User level and the blockchain address level.\nA single blockchain address cannot exceed the specified limits, even if multiple users submit requests to the same address.\n\n| Token | Amount per Faucet Request |Rolling 24-hour window Rate Limits|\n|:-----:|:-------------------------:|:--------------------------------:|\n| ETH   | 0.0001 ETH                | 0.1 ETH                          |\n| USDC  | 1 USDC                    | 10 USDC                          |\n| EURC  | 1 EURC                    | 10 EURC                          |\n| cbBTC | 0.0001 cbBTC              | 0.001 cbBTC                      |\n","operationId":"requestEvmFaucet","tags":["Faucets"],"security":[{"apiKeyAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"network":{"type":"string","description":"The network to request funds from.","enum":["base-sepolia","ethereum-sepolia","ethereum-hoodi"],"example":"base-sepolia"},"address":{"type":"string","description":"The address to request funds to, which is a 0x-prefixed hexadecimal string.","pattern":"^0x[0-9a-fA-F]{40}$","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"},"token":{"type":"string","description":"The token to request funds for.","enum":["eth","usdc","eurc","cbbtc"],"example":"eth"}},"required":["network","address","token"]}}}},"responses":{"200":{"description":"Successfully requested funds.","content":{"application/json":{"schema":{"type":"object","properties":{"transactionHash":{"type":"string","description":"The hash of the transaction that requested the funds.\n**Note:** In rare cases, when gas conditions are unusually high, the transaction may not confirm, and the system may issue a replacement transaction to complete the faucet request. In these rare cases, the `transactionHash` will be out of sync with the actual faucet transaction that was confirmed onchain.","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"}},"required":["transactionHash"]}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"request body has an error: doesn't match schema: Error at \"address\": string doesn't match the regular expression \"^0x[0-9a-fA-F]{40}$\"."}}}}}},"403":{"description":"Access to resource forbidden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"forbidden":{"value":{"errorType":"forbidden","errorMessage":"Unable to request faucet funds for this address."}}}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"faucet_limit_exceeded":{"value":{"errorType":"faucet_limit_exceeded","errorMessage":"Faucet limit reached for this address. Please try again later."}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/policy-engine/policies":{"get":{"x-audience":"public","summary":"List policies","description":"Lists the policies belonging to the developer's CDP Project. Use the `scope` parameter to filter the policies by scope.\nThe response is paginated, and by default, returns 20 policies per page.","operationId":"listPolicies","tags":["Policy Engine"],"security":[{"apiKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/PageSize"},{"$ref":"#/components/parameters/PageToken"},{"name":"scope","description":"The scope of the policies to return. If `project`, the response will include exactly one policy, which is the project-level policy. If `account`, the response will include all account-level policies for the developer's CDP Project.","in":"query","required":false,"schema":{"type":"string","enum":["project","account"]},"example":"project"}],"responses":{"200":{"description":"Successfully listed policies.","content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"policies":{"type":"array","items":{"$ref":"#/components/schemas/Policy"},"description":"The list of policies."}},"required":["policies"]},{"$ref":"#/components/schemas/ListResponse"}]}}}},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}},"post":{"x-audience":"public","summary":"Create policy","description":"Create a policy that can be used to govern the behavior of accounts.","operationId":"createPolicy","tags":["Policy Engine"],"security":[{"apiKeyAuth":[]}],"x-required-api-auth-scopes":["policies#manage"],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"scope":{"type":"string","description":"The scope of the policy.","enum":["project","account"],"example":"project"},"description":{"type":"string","description":"An optional human-readable description for the policy.\nPolicy descriptions can consist of alphanumeric characters, spaces, commas, and periods, and be 50 characters or less.","pattern":"^[A-Za-z0-9 ,.]{1,50}$","example":"Default policy"},"rules":{"type":"array","description":"A list of rules that comprise the policy. There is a limit of 10 rules per policy.","items":{"$ref":"#/components/schemas/Rule"}}},"required":["scope","rules"]}}}},"responses":{"201":{"description":"Successfully created policy.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Policy"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"Policy name must be between 1 and 50 characters."}}}}}},"409":{"$ref":"#/components/responses/AlreadyExistsError"},"422":{"$ref":"#/components/responses/IdempotencyError"},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/policy-engine/policies/{policyId}":{"get":{"x-audience":"public","summary":"Get policy by ID","description":"Get a policy by its ID.","operationId":"getPolicyById","tags":["Policy Engine"],"security":[{"apiKeyAuth":[]}],"parameters":[{"name":"policyId","description":"The ID of the policy to get.","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"example":"123e4567-e89b-12d3-a456-426614174000"}],"responses":{"200":{"description":"Successfully retrieved policy.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Policy"}}}},"404":{"description":"Policy not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"Policy not found."}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}},"delete":{"x-audience":"public","summary":"Delete policy","description":"Delete a policy by its ID. This will have the effect of removing the policy from all accounts that are currently using it.","operationId":"deletePolicy","tags":["Policy Engine"],"security":[{"apiKeyAuth":[]}],"x-required-api-auth-scopes":["policies#manage"],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"},{"name":"policyId","description":"The ID of the policy to delete.","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"example":"123e4567-e89b-12d3-a456-426614174000"}],"responses":{"204":{"description":"Successfully deleted policy."},"400":{"description":"Unable to delete policy.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"policy_in_use","errorMessage":"Policy in use."}}}}}},"404":{"description":"Policy not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"Policy not found."}}}}}},"409":{"$ref":"#/components/responses/AlreadyExistsError"},"422":{"$ref":"#/components/responses/IdempotencyError"},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}},"put":{"x-audience":"public","summary":"Update policy","description":"Updates a policy by its ID. This will have the effect of applying the updated policy to all accounts that are currently using it.","operationId":"updatePolicy","tags":["Policy Engine"],"security":[{"apiKeyAuth":[]}],"x-required-api-auth-scopes":["policies#manage"],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"},{"name":"policyId","description":"The ID of the policy to update.","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"example":"123e4567-e89b-12d3-a456-426614174000"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"description":{"type":"string","description":"An optional human-readable description for the policy.\nPolicy descriptions can consist of alphanumeric characters, spaces, commas, and periods, and be 50 characters or less.","pattern":"^[A-Za-z0-9 ,.]{1,50}$","example":"Default policy"},"rules":{"type":"array","description":"A list of rules that comprise the policy. There is a limit of 10 rules per policy.","items":{"$ref":"#/components/schemas/Rule"}}},"required":["rules"]}}}},"responses":{"200":{"description":"Successfully updated policy.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Policy"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"Policy name must be between 1 and 50 characters."}}}}}},"404":{"description":"Policy not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"Policy not found."}}}}}},"409":{"$ref":"#/components/responses/AlreadyExistsError"},"422":{"$ref":"#/components/responses/IdempotencyError"},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/solana/accounts":{"get":{"x-audience":"public","summary":"List Solana accounts","description":"Lists the Solana accounts belonging to the developer.\nThe response is paginated, and by default, returns 20 accounts per page.\n\nIf a name is provided, the response will contain only the account with that name.","operationId":"listSolanaAccounts","tags":["Solana Accounts"],"security":[{"apiKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/PageSize"},{"$ref":"#/components/parameters/PageToken"}],"responses":{"200":{"description":"Successfully listed Solana accounts.","content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"accounts":{"type":"array","items":{"$ref":"#/components/schemas/SolanaAccount"},"description":"The list of Solana accounts."}},"required":["accounts"]},{"$ref":"#/components/schemas/ListResponse"}]}}}},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}},"post":{"x-audience":"public","summary":"Create Solana account","description":"Creates a new Solana account.","operationId":"createSolanaAccount","tags":["Solana Accounts"],"security":[{"apiKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/XWalletAuth"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"An optional name for the account.\nAccount names can consist of alphanumeric characters and hyphens, and be between 2 and 36 characters long.\nAccount names must be unique across all Solana accounts in the developer's CDP Project.","example":"my-wallet","pattern":"^[A-Za-z0-9][A-Za-z0-9-]{0,34}[A-Za-z0-9]$"},"accountPolicy":{"type":"string","x-audience":"public","description":"The ID of the account-level policy to apply to the account.","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","example":"123e4567-e89b-12d3-a456-426614174000"}}}}}},"responses":{"201":{"description":"Successfully created Solana account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SolanaAccount"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"Project has no secret. Please register a secret with the project."}}}}}},"401":{"description":"Unauthorized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"unauthorized":{"value":{"errorType":"unauthorized","errorMessage":"Wallet authentication error."}}}}}},"402":{"$ref":"#/components/responses/PaymentMethodRequiredError"},"409":{"description":"Resource already exists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"already_exists":{"value":{"errorType":"already_exists","errorMessage":"Solana account with the given name already exists."}}}}}},"422":{"$ref":"#/components/responses/IdempotencyError"},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/solana/accounts/{address}":{"get":{"x-audience":"public","summary":"Get Solana account by address","description":"Gets a Solana account by its address.","operationId":"getSolanaAccount","tags":["Solana Accounts"],"security":[{"apiKeyAuth":[]}],"parameters":[{"name":"address","description":"The base58 encoded address of the Solana account.","in":"path","required":true,"schema":{"type":"string","pattern":"^[1-9A-HJ-NP-Za-km-z]{32,44}$"},"example":"HpabPRRCFbBKSuJr5PdkVvQc85FyxyTWkFM2obBRSvHT"}],"responses":{"200":{"description":"Successfully got Solana account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SolanaAccount"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"request body has an error: doesn't match schema: Error at \"address\": string doesn't match the regular expression \"^[1-9A-HJ-NP-Za-km-z]{32,44}$\"."}}}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"Solana account with the given address not found."}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}},"put":{"x-audience":"public","summary":"Update Solana account","description":"Updates an existing Solana account. Use this to update the account's name or account-level policy.","operationId":"updateSolanaAccount","tags":["Solana Accounts"],"security":[{"apiKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"},{"name":"address","description":"The base58 encoded address of the Solana account.","in":"path","required":true,"schema":{"type":"string","pattern":"^[1-9A-HJ-NP-Za-km-z]{32,44}$"},"example":"HpabPRRCFbBKSuJr5PdkVvQc85FyxyTWkFM2obBRSvHT"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"An optional name for the account. Account names can consist of alphanumeric characters and hyphens, and be between 2 and 36 characters long.\nAccount names must be unique across all Solana accounts in the developer's CDP Project.","example":"my-wallet","pattern":"^[A-Za-z0-9][A-Za-z0-9-]{0,34}[A-Za-z0-9]$"},"accountPolicy":{"type":"string","x-audience":"public","description":"The ID of the account-level policy to apply to the account, or an empty string to unset attached policy.","pattern":"(^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)|(^$)","example":"123e4567-e89b-12d3-a456-426614174000"}}}}}},"responses":{"200":{"description":"Successfully updated Solana account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SolanaAccount"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"request body has an error: doesn't match schema: Error at \"name\": string doesn't match the regular expression  \"^[A-Za-z0-9][A-Za-z0-9-]{0,34}[A-Za-z0-9]$\"."}}}}}},"404":{"description":"Solana account not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"Solana account with the given address not found."}}}}}},"409":{"$ref":"#/components/responses/AlreadyExistsError"},"422":{"$ref":"#/components/responses/IdempotencyError"},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/solana/accounts/by-name/{name}":{"get":{"x-audience":"public","summary":"Get Solana account by name","description":"Gets a Solana account by its name.","operationId":"getSolanaAccountByName","tags":["Solana Accounts"],"security":[{"apiKeyAuth":[]}],"parameters":[{"name":"name","description":"The name of the Solana account.","in":"path","required":true,"schema":{"type":"string"},"example":"my-account"}],"responses":{"200":{"description":"Successfully got Solana account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SolanaAccount"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"error: parameter \"name\" must be a string."}}}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"Solana account with the given name not found."}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/solana/accounts/import":{"post":{"x-audience":"public","summary":"Import Solana account","description":"Import an existing Solana account into the developer's CDP Project. This API should be called from the [CDP SDK](https://github.com/coinbase/cdp-sdk) to ensure that the associated private key is properly encrypted.","operationId":"importSolanaAccount","tags":["Solana Accounts"],"security":[{"apiKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/XWalletAuth"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"encryptedPrivateKey":{"type":"string","description":"The base64-encoded, encrypted 32-byte private key of the Solana account. The private key must be encrypted using the CDP SDK's encryption scheme.","example":"U2FsdGVkX1+vupppZksvRf5X5YgHq4+da+Q4qf51+Q4="},"name":{"type":"string","description":"An optional name for the account.\nAccount names can consist of alphanumeric characters and hyphens, and be between 2 and 36 characters long.\nAccount names must be unique across all EVM accounts in the developer's CDP Project.","example":"my-solana-wallet","pattern":"^[A-Za-z0-9][A-Za-z0-9-]{0,34}[A-Za-z0-9]$"}},"required":["encryptedPrivateKey"]}}}},"responses":{"201":{"description":"Successfully imported Solana account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SolanaAccount"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"The encrypted private key is invalid."}}}}}},"401":{"description":"Unauthorized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"unauthorized":{"value":{"errorType":"unauthorized","errorMessage":"Wallet authentication error."}}}}}},"402":{"$ref":"#/components/responses/PaymentMethodRequiredError"},"409":{"description":"Resource already exists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"already_exists":{"value":{"errorType":"already_exists","errorMessage":"Solana account with the given address already exists."}}}}}},"422":{"$ref":"#/components/responses/IdempotencyError"},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/solana/accounts/{address}/export":{"post":{"x-audience":"public","summary":"Export Solana account","description":"Export an existing Solana account's private key. It is important to store the private key in a secure place after it's exported.","operationId":"exportSolanaAccount","tags":["Solana Accounts"],"security":[{"apiKeyAuth":[]}],"x-required-api-auth-scopes":["accounts#export"],"parameters":[{"$ref":"#/components/parameters/XWalletAuth"},{"$ref":"#/components/parameters/IdempotencyKey"},{"name":"address","description":"The base58 encoded address of the Solana account.","in":"path","required":true,"schema":{"type":"string","pattern":"^[1-9A-HJ-NP-Za-km-z]{32,44}$"},"example":"HpabPRRCFbBKSuJr5PdkVvQc85FyxyTWkFM2obBRSvHT"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"exportEncryptionKey":{"type":"string","description":"The base64-encoded, public part of the RSA key in DER format used to encrypt the account private key.","example":"U2FsdGVkX1+vupppZksvRf5X5YgHq4+da+Q4qf51+Q4="}},"required":["exportEncryptionKey"]}}}},"responses":{"200":{"description":"Successfully exported Solana account.","content":{"application/json":{"schema":{"type":"object","properties":{"encryptedPrivateKey":{"type":"string","description":"The base64-encoded, encrypted private key of the Solana account which is a 32 byte raw private key. The private key is encrypted in transport using the exportEncryptionKey in the request.","example":"U2FsdGVkX1+vupppZksvRf5X5YgHq4+da+Q4qf51+Q4="}},"required":["encryptedPrivateKey"]}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"Solana account with the given address not found."}}}}}},"401":{"description":"Unauthorized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"unauthorized":{"value":{"errorType":"unauthorized","errorMessage":"Wallet authentication error."}}}}}},"402":{"$ref":"#/components/responses/PaymentMethodRequiredError"},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"Solana account with the given address not found."}}}}}},"422":{"$ref":"#/components/responses/IdempotencyError"},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/solana/accounts/export/by-name/{name}":{"post":{"x-audience":"public","summary":"Export Solana account by name","description":"Export an existing Solana account's private key by its name. It is important to store the private key in a secure place after it's exported.","operationId":"exportSolanaAccountByName","tags":["Solana Accounts"],"security":[{"apiKeyAuth":[]}],"x-required-api-auth-scopes":["accounts#export"],"parameters":[{"$ref":"#/components/parameters/XWalletAuth"},{"$ref":"#/components/parameters/IdempotencyKey"},{"name":"name","description":"The name of the Solana account.","in":"path","required":true,"schema":{"type":"string"},"example":"my-account"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"exportEncryptionKey":{"type":"string","description":"The base64-encoded, public part of the RSA key in DER format used to encrypt the account private key.","example":"U2FsdGVkX1+vupppZksvRf5X5YgHq4+da+Q4qf51+Q4="}},"required":["exportEncryptionKey"]}}}},"responses":{"200":{"description":"Successfully exported Solana account.","content":{"application/json":{"schema":{"type":"object","properties":{"encryptedPrivateKey":{"type":"string","description":"The base64-encoded, encrypted private key of the Solana account which is a 32 byte raw private key. The private key is encrypted in transport using the exportEncryptionKey in the request.","example":"U2FsdGVkX1+vupppZksvRf5X5YgHq4+da+Q4qf51+Q4="}},"required":["encryptedPrivateKey"]}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"error: parameter \"name\" must be a string."}}}}}},"401":{"description":"Unauthorized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"unauthorized":{"value":{"errorType":"unauthorized","errorMessage":"Wallet authentication error."}}}}}},"402":{"$ref":"#/components/responses/PaymentMethodRequiredError"},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"Solana account with the given name not found."}}}}}},"422":{"$ref":"#/components/responses/IdempotencyError"},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/solana/accounts/{address}/sign/transaction":{"post":{"x-audience":"public","summary":"Sign transaction","description":"Signs a transaction with the given Solana account.\nThe unsigned transaction should be serialized into a byte array and then encoded as base64.\n\n**Transaction types**\n\nThe following transaction types are supported:\n* [Legacy transactions](https://solana-labs.github.io/solana-web3.js/classes/Transaction.html)\n* [Versioned transactions](https://solana-labs.github.io/solana-web3.js/classes/VersionedTransaction.html)\n\nThe developer is responsible for ensuring that the unsigned transaction is valid, as the API will not validate the transaction.","operationId":"signSolanaTransaction","tags":["Solana Accounts"],"security":[{"apiKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/XWalletAuth"},{"$ref":"#/components/parameters/IdempotencyKey"},{"name":"address","description":"The base58 encoded address of the Solana account.","in":"path","required":true,"schema":{"type":"string","pattern":"^[1-9A-HJ-NP-Za-km-z]{32,44}$"},"example":"HpabPRRCFbBKSuJr5PdkVvQc85FyxyTWkFM2obBRSvHT"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"transaction":{"type":"string","description":"The base64 encoded transaction to sign.","example":"AQABAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAQECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8CBgMBAQAAAAIBAwQAAAAABgIAAAAAAAYDBQEBAAAGBAgAAAAABgUAAAAA6AMAAAAAAAAGBgUBAQEBBgcEAQAAAAYICgMBAQIDBgkCBgAAAAYKAwABAQEGCwMGAQEBBgwDAAABAQAAAAA="}},"required":["transaction"]}}}},"responses":{"200":{"description":"Successfully signed transaction.","content":{"application/json":{"schema":{"type":"object","properties":{"signedTransaction":{"type":"string","description":"The base64 encoded signed transaction.","example":"AQACAdSOvpk0UJXs/rQRXYKSI9hcR0bkGp24qGv6t0/M1XjcQpHf6AHwLcPjEtKQI7p/U0Zo98lnJ5/PZMfVq/0BAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAQECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8CBgMBAQAAAAIBAwQAAAAABgIAAAAAAAYDBQEBAAAGBAgAAAAABgUAAAAA6AMAAAAAAAAGBgUBAQEBBgcEAQAAAAYICgMBAQIDBgkCBgAAAAYKAwABAQEGCwMGAQEBBgwDAAABAQAAAAA="}},"required":["signedTransaction"]}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"malformed_transaction":{"value":{"errorType":"malformed_transaction","errorMessage":"Malformed unsigned transaction."}}}}}},"401":{"description":"Unauthorized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"unauthorized":{"value":{"errorType":"unauthorized","errorMessage":"Wallet authentication error."}}}}}},"402":{"$ref":"#/components/responses/PaymentMethodRequiredError"},"403":{"description":"Access to resource forbidden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"forbidden":{"value":{"errorType":"forbidden","errorMessage":"Unable to sign transaction for this address."}}}}}},"404":{"description":"Solana account not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"Solana account with the given address not found."}}}}}},"409":{"$ref":"#/components/responses/AlreadyExistsError"},"422":{"$ref":"#/components/responses/IdempotencyError"},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/solana/accounts/{address}/sign/message":{"post":{"x-audience":"public","summary":"Sign message","description":"Signs an arbitrary message with the given Solana account.\n\n**WARNING:** Never sign a message that you didn't generate, as it can be an arbitrary transaction. For example, it might send all of your funds to an attacker.","operationId":"signSolanaMessage","tags":["Solana Accounts"],"security":[{"apiKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/XWalletAuth"},{"$ref":"#/components/parameters/IdempotencyKey"},{"name":"address","description":"The base58 encoded address of the Solana account.","in":"path","required":true,"schema":{"type":"string","pattern":"^[1-9A-HJ-NP-Za-km-z]{32,44}$"},"example":"HpabPRRCFbBKSuJr5PdkVvQc85FyxyTWkFM2obBRSvHT"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"The arbitrary message to sign.","example":"Hello, world!"}},"required":["message"]}}}},"responses":{"200":{"description":"Successfully signed message.","content":{"application/json":{"schema":{"type":"object","properties":{"signature":{"type":"string","description":"The signature of the message, as a base58 encoded string.","example":"4YecmNqVT9QFqzuSvE9Zih3toZzNAijjXpj8xupgcC6E4VzwzFjuZBk5P99yz9JQaLRLm1K4L4FpMjxByFxQBe2h"}},"required":["signature"]}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"request body has an error: doesn't match schema: Error at \"message\": string doesn't match the regular expression \"^0x[0-9a-fA-F]{40}$\"."}}}}}},"401":{"description":"Unauthorized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"unauthorized":{"value":{"errorType":"unauthorized","errorMessage":"Wallet authentication error."}}}}}},"402":{"$ref":"#/components/responses/PaymentMethodRequiredError"},"404":{"description":"Solana account not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"Solana account with the given address not found."}}}}}},"409":{"$ref":"#/components/responses/AlreadyExistsError"},"422":{"$ref":"#/components/responses/IdempotencyError"},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/solana/accounts/send/transaction":{"post":{"x-audience":"public","summary":"Send Solana transaction","description":"Signs and sends a single Solana transaction using multiple Solana accounts. The transaction may contain contain several instructions, each of which may require signatures from different account keys.\n\nThe transaction should be serialized into a byte array and base64 encoded. The API handles recent blockhash management and fee estimation, leaving the developer to provide only the minimal set of fields necessary to send the transaction.\n\n**Transaction types**\n\nThe following transaction types are supported:\n* [Legacy transactions](https://solana.com/developers/guides/advanced/versions#current-transaction-versions)\n* [Versioned transactions](https://solana.com/developers/guides/advanced/versions)\n\n**Instruction Batching**\n\nTo batch multiple operations, include multiple instructions within a single transaction. All instructions within a transaction are executed atomically - if any instruction fails, the entire transaction fails and is rolled back.\n\n**Network Support**\n\nThe following Solana networks are supported:\n* `solana` - Solana Mainnet\n* `solana-devnet` - Solana Devnet\n\nThe developer is responsible for ensuring that the unsigned transaction is valid, as the API will not validate the transaction.","operationId":"sendSolanaTransaction","tags":["Solana Accounts"],"security":[{"apiKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/XWalletAuth"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"network":{"type":"string","description":"The Solana network to send the transaction to.","enum":["solana","solana-devnet"],"example":"solana-devnet"},"transaction":{"type":"string","description":"The base64 encoded transaction to sign and send. This transaction can contain multiple instructions for native Solana batching.","example":"AQABAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAQECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8CBgMBAQAAAAIBAwQAAAAABgIAAAAAAAYDBQEBAAAGBAgAAAAABgUAAAAA6AMAAAAAAAAGBgUBAQEBBgcEAQAAAAYICgMBAQIDBgkCBgAAAAYKAwABAQEGCwMGAQEBBgwDAAABAQAAAAA="},"useCdpSponsor":{"type":"boolean","description":"Whether transaction fees should be sponsored by CDP. When true, CDP sponsors the transaction fees on behalf of the server wallet. When false, the server wallet is responsible for paying the transaction fees.","example":true}},"required":["network","transaction"]},"examples":{"send_transaction":{"summary":"Send a transaction","value":{"network":"solana-devnet","transaction":"AQABAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAQECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8CBgMBAQAAAAIBAwQAAAAABgIAAAAAAAYDBQEBAAAGBAgAAAAABgUAAAAA6AMAAAAAAAAGBgUBAQEBBgcEAQAAAAYICgMBAQIDBgkCBgAAAAYKAwABAQEGCwMGAQEBBgwDAAABAQAAAAA="}},"send_transaction_sponsored":{"summary":"Send a transaction with CDP fee sponsorship","value":{"network":"solana-devnet","transaction":"AQABAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAQECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8CBgMBAQAAAAIBAwQAAAAABgIAAAAAAAYDBQEBAAAGBAgAAAAABgUAAAAA6AMAAAAAAAAGBgUBAQEBBgcEAQAAAAYICgMBAQIDBgkCBgAAAAYKAwABAQEGCwMGAQEBBgwDAAABAQAAAAA=","useCdpSponsor":true}}}}}},"responses":{"200":{"description":"Successfully signed and sent transaction.","content":{"application/json":{"schema":{"type":"object","properties":{"transactionSignature":{"type":"string","description":"The base58 encoded transaction signature.","example":"5VERv8NMvzbJMEkV8xnrLkEaWRtSz9CosKDYjCJjBRnbJLgp8uirBgmQpjKhoR4tjF3ZpRzrFmBV6UjKdiSZkQUW"}},"required":["transactionSignature"]}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"malformed_transaction":{"value":{"errorType":"malformed_transaction","errorMessage":"Malformed unsigned transaction."}}}}}},"401":{"description":"Unauthorized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"unauthorized":{"value":{"errorType":"unauthorized","errorMessage":"Wallet authentication error."}}}}}},"402":{"$ref":"#/components/responses/PaymentMethodRequiredError"},"403":{"description":"Access to resource forbidden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"forbidden":{"value":{"errorType":"forbidden","errorMessage":"Unable to sign transaction for this address."}}}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"Solana account with the given address not found."}}}}}},"422":{"$ref":"#/components/responses/IdempotencyError"},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/solana/faucet":{"post":{"x-audience":"public","summary":"Request funds on Solana devnet","description":"Request funds from the CDP Faucet on Solana devnet.\n\nFaucets are available for SOL, USDC, and CBTUSD.\n\nTo prevent abuse, we enforce rate limits within a rolling 24-hour window to control the amount of funds that can be requested.\nThese limits are applied at both the CDP Project level and the blockchain address level.\nA single blockchain address cannot exceed the specified limits, even if multiple users submit requests to the same address.\n\n| Token  | Amount per Faucet Request |Rolling 24-hour window Rate Limits|\n|:-----: |:-------------------------:|:--------------------------------:|\n| SOL    | 0.00125 SOL               | 0.0125 SOL                       |\n| USDC   | 1 USDC                    | 10 USDC                          |\n| CBTUSD | 1 CBTUSD                  | 10 CBTUSD                        |\n","operationId":"requestSolanaFaucet","tags":["Faucets"],"security":[{"apiKeyAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"address":{"type":"string","description":"The address to request funds to, which is a base58-encoded string.","pattern":"^[1-9A-HJ-NP-Za-km-z]{32,44}$","example":"HpabPRRCFbBKSuJr5PdkVvQc85FyxyTWkFM2obBRSvHT"},"token":{"type":"string","description":"The token to request funds for.","enum":["sol","usdc","cbtusd"],"example":"sol"}},"required":["address","token"]}}}},"responses":{"200":{"description":"Successfully requested funds.","content":{"application/json":{"schema":{"type":"object","properties":{"transactionSignature":{"type":"string","description":"The signature identifying the transaction that requested the funds.","example":"4dje1d24iG2FfxwxTJJt8VSTtYXNc6AAuJwngtL97TJSqqPD3pgRZ7uh4szoU6WDrKyFTBgaswkDrCr7BqWjQqqK"}},"required":["transactionSignature"]}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_address_format":{"value":{"errorType":"invalid_request","errorMessage":"request body has an error: doesn't match schema: Error at \"address\": string doesn't match the regular expression \"^[1-9A-HJ-NP-Za-km-z]{32,44}$\"."}},"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"Unable to request faucet funds for this address."}}}}}},"403":{"description":"Access to resource forbidden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"forbidden":{"value":{"errorType":"forbidden","errorMessage":"Unable to request faucet funds for this address."}}}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"faucet_limit_exceeded":{"value":{"errorType":"faucet_limit_exceeded","errorMessage":"Faucet limit reached for this address. Please try again later."}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/solana/token-balances/{network}/{address}":{"get":{"x-audience":"public","summary":"List Solana token balances","description":"Lists the token balances of a Solana address on a given network. The balances include SPL tokens and the native SOL token. The response is paginated, and by default, returns 20 balances per page.\n\n**Note:** This endpoint is still under development and does not yet provide strong availability or freshness guarantees. Freshness and availability of new token balances will improve over the coming weeks.","operationId":"listSolanaTokenBalances","tags":["Solana Token Balances"],"security":[{"apiKeyAuth":[]}],"parameters":[{"name":"address","description":"The base58 encoded Solana address to get balances for.","in":"path","required":true,"schema":{"type":"string","pattern":"^[1-9A-HJ-NP-Za-km-z]{32,44}$"},"example":"HpabPRRCFbBKSuJr5PdkVvQc85FyxyTWkFM2obBRSvHT"},{"name":"network","description":"The human-readable network name to get the balances for.","in":"path","required":true,"schema":{"$ref":"#/components/schemas/ListSolanaTokenBalancesNetwork"},"example":"solana"},{"name":"pageSize","description":"The number of balances to return per page.","in":"query","required":false,"schema":{"type":"integer","default":20},"example":10},{"name":"pageToken","description":"The token for the next page of balances. Will be empty if there are no more balances to fetch.","in":"query","required":false,"schema":{"type":"string"},"example":"eyJsYXN0X2lkIjogImFiYzEyMyIsICJ0aW1lc3RhbXAiOiAxNzA3ODIzNzAxfQ=="}],"responses":{"200":{"description":"Successfully listed token balances.","content":{"application/json":{"schema":{"allOf":[{"type":"object","required":["balances"],"properties":{"balances":{"type":"array","items":{"$ref":"#/components/schemas/SolanaTokenBalance"},"description":"The list of Solana token balances.","example":[{"amount":{"amount":"1250000000","decimals":9},"token":{"symbol":"SOL","name":"Solana","mintAddress":"So11111111111111111111111111111111111111111"}},{"amount":{"amount":"123456000","decimals":6},"token":{"symbol":"USDC","name":"USD Coin","mintAddress":"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU"}}]}}},{"$ref":"#/components/schemas/ListResponse"}]}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"string doesn't match the regular expression \"^[1-9A-HJ-NP-Za-km-z]{32,44}$\"."}}}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"Address not found, or no balances found for the given address on this chain."}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/data/query/run":{"post":{"operationId":"runSQLQuery","summary":"Run SQL Query","x-audience":"public","description":"Run a read-only SQL query against indexed blockchain data including transactions, events, and decoded logs.\n\nThis endpoint provides direct SQL access to comprehensive blockchain data across supported networks.\n\nQueries are executed against optimized data structures for high-performance analytics.\n\n### Allowed Queries\n\n  - Standard SQL syntax (CoinbaSeQL dialect, based on ClickHouse dialect)\n  - Read-only queries (SELECT statements)\n  - No DDL or DML operations\n  - Query that follow limits (defined below)\n\n### Supported Networks\n\n  - Base Mainnet: `base`\n  - Base Sepolia: `base_sepolia`\n  - Solana Mainnet: `solana`\n  - Hyperevm Mainnet: `hyperevm`\n\n### Supported Tables\n\nThe below tables are supported for `base` and `base_sepolia` networks.\n\n  | Table | Description |\n  | --- | --- |\n  | `<network>.events` | Decoded event logs with parameters, event signature, topics, and more. |\n  | `<network>.transactions` | Transaction data including hash, block number, and gas usage. |\n  | `<network>.blocks` | Block information. |\n  | `<network>.encoded_logs` | Encoded log data for event logs that cannot be decoded by our event decoder (ex: log0 opcode). |\n  | `<network>.decoded_user_operations` | Decoded user operations data including hash, block number, gas usage, builder codes, entrypoint version, and more. |\n  | `<network>.transaction_attributions` | Information about the attributions of a transaction to a builder and associated builder codes. |\n\n  Following the above, the valid tables on Base Mainnet are `base.events`, `base.transactions`, `base.blocks`, `base.encoded_logs`, `base.decoded_user_operations`, and `base.transaction_attributions`.\n\nSeparately, there is a limited set of tables supported for `solana` and `hyperevm` networks:\n\n  | Table | Description |\n  | --- | --- |\n  | `solana.instructions` | Solana instruction call data including program ID, instruction data, and more. Currently supports just Token2022 and SPL Token programs. |\n  | `hyperevm.events` | Hyperevm decoded event logs with parameters, event signature, topics, and more. Currently supports just B20 events. |\n\n### Query Limits\n\n  - Maximum result set: 50,000 rows\n  - Maximum query length: 10,000 characters\n  - Maximum on-disk data to read: 100GB\n  - Maximum memory usage: 15GB\n  - Query timeout: 30 seconds\n  - Maximum JOINs: 12\n\n### Query Caching\n\nBy default, each query result is returned from cache so long as the result is from an identical query and less than 750ms old. This freshness tolerance can be modified upwards, to a maximum of 900000ms (i.e. 900s, 15m).\nThis can be helpful for users who wish to reduce expensive calls to the SQL API by reusing cached results.\n","tags":["SQL API"],"security":[{"apiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnchainDataQuery"}}}},"responses":{"200":{"description":"Query run successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnchainDataResult"}}}},"400":{"$ref":"#/components/responses/InvalidSQLQueryError"},"401":{"$ref":"#/components/responses/UnauthorizedError"},"402":{"$ref":"#/components/responses/PaymentMethodRequiredError"},"408":{"description":"Query timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"query_timeout":{"value":{"errorType":"timed_out","errorMessage":"Query execution was cut off by the server. Please try again with a more efficient query."}}}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"rate_limit_exceeded":{"value":{"errorType":"rate_limit_exceeded","errorMessage":"Too many requests. Please try again later."}}}}}},"499":{"$ref":"#/components/responses/ClientClosedRequestError"},"500":{"$ref":"#/components/responses/InternalServerError"},"504":{"$ref":"#/components/responses/TimedOutError"}}}},"/v2/data/query/grammar":{"get":{"operationId":"getSQLGrammar","summary":"Get SQL grammar","x-audience":"public","description":"Retrieve the SQL grammar for the SQL API.\n\nThe SQL queries that are supported by the SQL API are defined in ANTLR4 grammar which is evaluated by server before executing the query. This ensures the safety and soundness of the SQL query before execution.\n\nThis endpoint returns the ANTLR4 grammar that is used to evaluate the SQL queries so that developers can understand the SQL API and build SQL queries with high confidence and correctness.\n\nLLMs interact well with ANTLR4 grammar. You can feed the grammar directly into the LLMs to help generate SQL queries.\n","tags":["SQL API"],"security":[{"apiKeyAuth":[]}],"responses":{"200":{"description":"SQL grammar retrieved successfully.","content":{"application/json":{"schema":{"type":"string","description":"The ANTLR4 grammar for the SQL API.","example":"grammar SqlQuery; query: cteClause? unionStatement SEMICOLON? EOF;"}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"rate_limit_exceeded":{"value":{"errorType":"rate_limit_exceeded","errorMessage":"Too many requests. Please try again later."}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"},"504":{"$ref":"#/components/responses/TimedOutError"}}}},"/v2/data/query/schema":{"get":{"operationId":"getSQLSchema","summary":"Get schema details","x-audience":"public","description":"Retrieve the schema information for the available tables in the SQL API's indexed data.\n\nThis includes table names, column definitions, data types, and indexed fields.\n","tags":["SQL API"],"security":[{"apiKeyAuth":[]}],"parameters":[{"name":"database","in":"query","required":false,"description":"The name of the database to query. Defaults to \"base\" when not specified.","schema":{"type":"string","enum":["base","base_sepolia","solana","hyperevm"],"default":"base"},"example":"base"},{"name":"table","in":"query","required":false,"description":"Get the schema for a specific table.","schema":{"type":"string"},"example":"events"}],"responses":{"200":{"description":"Schema information retrieved successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnchainDataSchemaResponse"}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/data/evm/token-ownership/{network}/{address}":{"get":{"operationId":"listTokensForAccount","summary":"List token addresses for account","x-audience":"public","description":"Retrieve all ERC-20 token contract addresses that an account has ever received tokens from.\nAnalyzes transaction history to discover token interactions.\n","tags":["Onchain Data"],"security":[{"apiKeyAuth":[]}],"parameters":[{"name":"network","in":"path","required":true,"description":"The blockchain network to query.","schema":{"type":"string","enum":["base","base-sepolia"]},"example":"base"},{"name":"address","in":"path","required":true,"description":"The account address to analyze for token interactions.","schema":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"}],"responses":{"200":{"description":"Token addresses retrieved successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountTokenAddressesResponse"}}}},"400":{"description":"Invalid account address format.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_address":{"value":{"errorType":"invalid_request","errorMessage":"Invalid account address format. Address must be 40 hex characters prefixed with '0x'."}}}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"rate_limit_exceeded":{"value":{"errorType":"rate_limit_exceeded","errorMessage":"Too many requests. Please try again later."}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/data/evm/token-balances/{network}/{address}":{"get":{"summary":"List EVM token balances","x-audience":"public","description":"Lists the token balances of an EVM address on a given network. The balances include ERC-20 tokens and the native gas token (usually ETH). The response is paginated, and by default, returns 20 balances per page.\n\n**Note:** This endpoint provides <1 second freshness from chain tip, <500ms response latency for wallets with reasonable token history, and 99.9% uptime for production use.","operationId":"listDataTokenBalances","tags":["Onchain Data"],"security":[{"apiKeyAuth":[]}],"parameters":[{"name":"address","description":"The 0x-prefixed EVM address to get balances for. The address does not need to be checksummed.","in":"path","required":true,"schema":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"},{"name":"network","description":"The human-readable network name to get the balances for.","in":"path","required":true,"schema":{"$ref":"#/components/schemas/ListEvmTokenBalancesNetwork"},"example":"base"},{"$ref":"#/components/parameters/PageSize"},{"$ref":"#/components/parameters/PageToken"}],"responses":{"200":{"description":"Successfully listed token balances.","content":{"application/json":{"schema":{"allOf":[{"type":"object","required":["balances"],"properties":{"balances":{"type":"array","items":{"$ref":"#/components/schemas/TokenBalance"},"description":"The list of EVM token balances.","example":[{"amount":{"amount":"1250000000000000000","decimals":18},"token":{"network":"base","symbol":"ETH","name":"ether","contractAddress":"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"}},{"amount":{"amount":"123456","decimals":6},"token":{"network":"base","symbol":"USDC","name":"USD Coin","contractAddress":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}}]}}},{"$ref":"#/components/schemas/ListResponse"}]}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"string doesn't match the regular expression \"^0x[0-9a-fA-F]{40}$\"."}}}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"Address not found, or no balances found for the given address on this chain."}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/data/webhooks/subscriptions":{"get":{"operationId":"listWebhookSubscriptions","summary":"List webhook subscriptions","x-audience":"public","x-required-permissions":{"permissions":["accounts:read@entity"],"enforcement":"any"},"description":"Retrieve a paginated list of webhook subscriptions for the authenticated project.\nReturns subscriptions for all CDP product events (onchain, onramp/offramp, wallet, etc.)\nin descending order by creation time.\n\n### Use Cases\n- Monitor all active webhook subscriptions across CDP products\n- Audit webhook configurations\n- Manage subscription lifecycle\n","tags":["Webhooks"],"security":[{"apiKeyAuth":[]}],"parameters":[{"name":"pageSize","description":"The number of subscriptions to return per page.","in":"query","required":false,"schema":{"type":"integer","default":20,"minimum":1,"maximum":100},"example":10},{"name":"pageToken","description":"The token for the next page of subscriptions, if any.","in":"query","required":false,"schema":{"type":"string"},"example":"eyJsYXN0X2lkIjogImFiYzEyMyIsICJ0aW1lc3RhbXAiOiAxNzA3ODIzNzAxfQ=="}],"responses":{"200":{"description":"Webhook subscriptions retrieved successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookSubscriptionListResponse"}}}},"400":{"description":"Invalid request parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_page_size":{"value":{"errorType":"invalid_request","errorMessage":"Page size must be between 1 and 100."}},"invalid_page_token":{"value":{"errorType":"invalid_request","errorMessage":"Invalid page token format."}}}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"rate_limit_exceeded":{"value":{"errorType":"rate_limit_exceeded","errorMessage":"Too many requests. Please try again later."}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"}}},"post":{"operationId":"createWebhookSubscription","summary":"Create webhook subscription","x-audience":"public","x-required-permissions":{"permissions":["accounts:write@entity"],"enforcement":"any"},"description":"Subscribe to real-time events across CDP products.\n\n### Filtering\n\nOnchain events can utilize multi-label filtering to only receive events that match all the specified labels.\n\nAllows labels are:\n- `network` (required) — Blockchain network\n- `contract_address` — Smart contract address\n- `event_name` — Event name (e.g., \"Transfer\", \"Burn\")\n- `event_signature` — Event signature (e.g., \"Transfer(address,address,uint256)\")\n- `transaction_from` — Transaction sender address\n- `transaction_to` — Transaction recipient address\n- `params.*` — Any event parameter from the log event (e.g., `params.from`, `params.to`, `params.sender`, `params.tokenId`)\n\nFor webhook types that aren't `onchain.*`, labels are ignored.\n\n### Webhook Signature Verification\n\nAll webhooks include an HMAC-SHA256 signed header for security. The signature is signed with the secret that is returned in the `secret` field when creating a subscription.\n\nDo not lose the secret, as you will not be able to recreate it. If you lose the secret, you will need to create a new subscription.\n\nSee the [verification guide](https://docs.cdp.coinbase.com/onramp-&-offramp/webhooks#webhook-signature-verification) for implementation details.\n","tags":["Webhooks"],"security":[{"apiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookSubscriptionRequest"},"examples":{"onchain_liquidity_pool":{"summary":"Onchain: Monitor liquidity pool burns","value":{"description":"Liquidity pool burn events.","eventTypes":["onchain.activity.detected"],"labels":{"network":"base-mainnet","contract_address":"0xcd1f9777571493aeacb7eae45cd30a226d3e612d","event_name":"Burn"},"target":{"url":"https://api.example.com/webhooks"},"isEnabled":true}},"wallet_outgoing_transactions":{"summary":"Wallet: Monitor outgoing transactions","value":{"description":"Outgoing transactions.","eventTypes":["wallet.activity.detected"],"labels":{"network":"base-mainnet","params.from":"0xB7f5BF799fB265657c628ef4a13f90f83a3a616A"},"target":{"url":"https://api.example.com/webhooks"},"isEnabled":true}}}}}},"responses":{"201":{"description":"Webhook subscription created successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookSubscriptionResponse"}}}},"400":{"description":"Invalid subscription configuration.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_url":{"value":{"errorType":"invalid_request","errorMessage":"Target URL must be a valid HTTPS endpoint."}},"invalid_event_types":{"value":{"errorType":"invalid_request","errorMessage":"Event types must be non-empty and contain valid event type names."}}}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"rate_limit_exceeded":{"value":{"errorType":"rate_limit_exceeded","errorMessage":"Too many requests. Please try again later."}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/data/webhooks/subscriptions/{subscriptionId}":{"get":{"operationId":"getWebhookSubscription","summary":"Get webhook subscription","x-audience":"public","x-required-permissions":{"permissions":["accounts:read@entity"],"enforcement":"any"},"description":"Retrieve detailed information about a specific webhook subscription including\nconfiguration, status, creation timestamp, and webhook signature secret.\n\n### Response Includes\n- Subscription configuration and filters\n- Target URL and custom headers\n- Webhook signature secret for verification\n- Creation timestamp and status\n","tags":["Webhooks"],"security":[{"apiKeyAuth":[]}],"parameters":[{"name":"subscriptionId","in":"path","required":true,"description":"Unique identifier for the webhook subscription.","schema":{"type":"string","format":"uuid","pattern":"^[a-f0-9\\-]{36}$"},"example":"123e4567-e89b-12d3-a456-426614174000"}],"responses":{"200":{"description":"Webhook subscription details retrieved successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookSubscriptionResponse"}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"404":{"description":"Webhook subscription not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"subscription_not_found":{"value":{"errorType":"not_found","errorMessage":"Webhook subscription not found."}}}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"rate_limit_exceeded":{"value":{"errorType":"rate_limit_exceeded","errorMessage":"Too many requests. Please try again later."}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"}}},"put":{"operationId":"updateWebhookSubscription","summary":"Update webhook subscription","x-audience":"public","x-required-permissions":{"permissions":["accounts:write@entity"],"enforcement":"any"},"description":"Update an existing webhook subscription's configuration including\nevent types, target URL, filtering criteria, and enabled status.\nAll required fields must be provided, even if they are not being changed.\n\n### Common Updates\n- Change target URL or headers\n- Add/remove event type filters\n- Update multi-label filtering criteria\n- Enable/disable subscription\n","tags":["Webhooks"],"security":[{"apiKeyAuth":[]}],"parameters":[{"name":"subscriptionId","in":"path","required":true,"description":"Unique identifier for the webhook subscription.","schema":{"type":"string","format":"uuid","pattern":"^[a-f0-9\\-]{36}$"},"example":"123e4567-e89b-12d3-a456-426614174000"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookSubscriptionUpdateRequest"}}}},"responses":{"200":{"description":"Webhook subscription updated successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookSubscriptionResponse"}}}},"400":{"description":"Invalid subscription update configuration.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_url":{"value":{"errorType":"invalid_request","errorMessage":"Target URL must be a valid HTTPS endpoint."}},"invalid_event_types":{"value":{"errorType":"invalid_request","errorMessage":"Event types must be non-empty and contain valid event type names."}}}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"404":{"description":"Webhook subscription not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"subscription_not_found":{"value":{"errorType":"not_found","errorMessage":"Webhook subscription not found."}}}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"rate_limit_exceeded":{"value":{"errorType":"rate_limit_exceeded","errorMessage":"Too many requests. Please try again later."}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"}}},"delete":{"operationId":"deleteWebhookSubscription","summary":"Delete webhook subscription","x-audience":"public","x-required-permissions":{"permissions":["accounts:write@entity"],"enforcement":"any"},"description":"Permanently delete a webhook subscription and stop all event deliveries.\nThis action cannot be undone.\n\n### Important Notes\n- All webhook deliveries will cease immediately\n- Subscription cannot be recovered after deletion\n- Consider disabling instead of deleting for temporary pauses\n","tags":["Webhooks"],"security":[{"apiKeyAuth":[]}],"parameters":[{"name":"subscriptionId","in":"path","required":true,"description":"Unique identifier for the webhook subscription.","schema":{"type":"string","format":"uuid","pattern":"^[a-f0-9\\-]{36}$"},"example":"123e4567-e89b-12d3-a456-426614174000"}],"responses":{"204":{"description":"Webhook subscription deleted successfully."},"401":{"$ref":"#/components/responses/UnauthorizedError"},"404":{"description":"Webhook subscription not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"subscription_not_found":{"value":{"errorType":"not_found","errorMessage":"Webhook subscription not found."}}}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"rate_limit_exceeded":{"value":{"errorType":"rate_limit_exceeded","errorMessage":"Too many requests. Please try again later."}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/data/webhooks/subscriptions/{subscriptionId}/events":{"get":{"operationId":"listWebhookSubscriptionEvents","summary":"List webhook subscription events","x-audience":"public","x-required-permissions":{"permissions":["accounts:read@entity"],"enforcement":"any"},"description":"Retrieve webhook event delivery attempts for a specific subscription.\nReturns event deliveries in descending order by creation time (newest first),\nincluding delivery status, retry count, and response details.\n\n### Use Cases\n- Debug webhook delivery failures and inspect response codes\n- Monitor delivery status and retry counts\n- Audit event delivery history for a subscription\n- Verify that expected events were sent to webhook URLs\n\n### Filtering\nUse optional query parameters to narrow results:\n- `eventId` — find a specific event by ID\n- `minCreatedAt` / `maxCreatedAt` — filter by time range\n- `eventTypeNames` — filter by event type (comma-separated)\n\n**Note:** Results are limited to the 50 most recent events (newest first). No pagination is supported.\n","tags":["Webhooks"],"security":[{"apiKeyAuth":[]}],"parameters":[{"name":"subscriptionId","in":"path","required":true,"description":"Unique identifier for the webhook subscription.","schema":{"type":"string","format":"uuid","pattern":"^[a-f0-9\\-]{36}$"},"example":"123e4567-e89b-12d3-a456-426614174000"},{"name":"eventId","in":"query","required":false,"description":"Filter by a specific event ID.","schema":{"type":"string","format":"uuid"},"example":"a1b2c3d4-e5f6-7890-abcd-ef1234567890"},{"name":"minCreatedAt","in":"query","required":false,"description":"Filter events created at or after this timestamp (RFC 3339 format).","schema":{"type":"string","format":"date-time"},"example":"2025-01-15T00:00:00Z"},{"name":"maxCreatedAt","in":"query","required":false,"description":"Filter events created at or before this timestamp (RFC 3339 format).","schema":{"type":"string","format":"date-time"},"example":"2025-01-16T00:00:00Z"},{"name":"eventTypeNames","in":"query","required":false,"description":"Filter by event type names (comma-separated).","schema":{"type":"string"},"example":"onchain.activity.detected"}],"responses":{"200":{"description":"Webhook events retrieved successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEventListResponse"}}}},"400":{"description":"Invalid request parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_min_created_at":{"value":{"errorType":"invalid_request","errorMessage":"minCreatedAt must be a valid RFC 3339 timestamp."}},"invalid_max_created_at":{"value":{"errorType":"invalid_request","errorMessage":"maxCreatedAt must be a valid RFC 3339 timestamp."}},"unknown_event_type_names":{"value":{"errorType":"invalid_request","errorMessage":"Unknown event type names: invalid.event.type."}}}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"404":{"description":"Webhook subscription not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"subscription_not_found":{"value":{"errorType":"not_found","errorMessage":"Webhook subscription not found."}}}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"rate_limit_exceeded":{"value":{"errorType":"rate_limit_exceeded","errorMessage":"Too many requests. Please try again later."}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/x402/verify":{"post":{"x-audience":"public","summary":"Verify payment","description":"Verify an x402 protocol payment with a specific scheme and network.","operationId":"verifyX402Payment","tags":["x402 Facilitator"],"security":[{"apiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"x402Version":{"$ref":"#/components/schemas/X402Version"},"paymentPayload":{"$ref":"#/components/schemas/x402PaymentPayload"},"paymentRequirements":{"$ref":"#/components/schemas/x402PaymentRequirements"}},"required":["x402Version","paymentPayload","paymentRequirements"]}}}},"responses":{"200":{"$ref":"#/components/responses/x402VerifyResponse"},"400":{"$ref":"#/components/responses/x402VerifyInvalidError"},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/x402/settle":{"post":{"x-audience":"public","summary":"Settle payment","description":"Settle an x402 protocol payment with a specific scheme and network.","operationId":"settleX402Payment","tags":["x402 Facilitator"],"security":[{"apiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"x402Version":{"$ref":"#/components/schemas/X402Version"},"paymentPayload":{"$ref":"#/components/schemas/x402PaymentPayload"},"paymentRequirements":{"$ref":"#/components/schemas/x402PaymentRequirements"}},"required":["x402Version","paymentPayload","paymentRequirements"]}}}},"responses":{"200":{"$ref":"#/components/responses/x402SettleResponse"},"400":{"$ref":"#/components/responses/x402SettleError"},"402":{"$ref":"#/components/responses/PaymentMethodRequiredError"},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/x402/supported":{"get":{"x-audience":"public","summary":"Get supported payment schemes and networks","description":"Get the supported x402 protocol payment schemes and networks that the facilitator is able to verify and settle payments for.","operationId":"supportedX402PaymentKinds","tags":["x402 Facilitator"],"security":[{"apiKeyAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/x402SupportedPaymentKindsResponse"},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/x402/discovery/resources":{"get":{"x-audience":"public","summary":"List x402 resources","description":"Lists all active discovered x402 resources.\nThis endpoint returns resources that have been discovered and cached by the x402 facilitator, including their payment requirements and metadata.\nThe response is paginated, and by default, returns 100 items per page.","operationId":"listX402DiscoveryResources","tags":["x402 Facilitator"],"security":[{"unauthenticated":[]}],"parameters":[{"name":"type","in":"query","description":"Filter by protocol type (e.g., \"http\", \"mcp\").\nCurrently, the only supported protocol type is \"http\".","required":false,"schema":{"type":"string","example":"http"}},{"name":"limit","in":"query","description":"The number of discovered x402 resources to return per page.","required":false,"schema":{"type":"integer","default":100},"example":50},{"name":"offset","in":"query","description":"The offset of the first discovered x402 resource to return.","required":false,"schema":{"type":"integer","default":0},"example":0}],"responses":{"200":{"description":"Successfully retrieved discovery list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/x402DiscoveryResourcesResponse"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"Invalid request. Please check the request parameters."}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/x402/discovery/merchant":{"get":{"x-audience":"public","summary":"List merchant discovery info","description":"Gets x402 merchant discovery information for a given merchant payment address.\nThis endpoint returns all active x402 resources associated with the specified `payTo` address, allowing clients to discover what payment-gated resources a merchant exposes and their corresponding payment requirements.\nIf no active resources are found for the `payTo` address, the endpoint returns an empty `resources` list.\nThe response is paginated, and by default, returns 20 items per page.","operationId":"listX402DiscoveryMerchant","tags":["x402 Facilitator"],"security":[{"unauthenticated":[]}],"parameters":[{"name":"payTo","in":"query","description":"The merchant's payment address to look up.\nThis is the onchain address that payment requirements route funds to.","required":true,"schema":{"$ref":"#/components/schemas/BlockchainAddress"},"example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"},{"name":"limit","in":"query","description":"The number of resources to return per page.","required":false,"schema":{"type":"integer","default":20},"example":20},{"name":"offset","in":"query","description":"The offset of the first resource to return.","required":false,"schema":{"type":"integer","default":0},"example":0}],"responses":{"200":{"description":"Successfully retrieved merchant discovery info.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/x402DiscoveryMerchantResponse"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"Invalid request. Please check the request parameters."}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/x402/discovery/search":{"get":{"x-audience":"public","summary":"Search x402 resources","description":"Searches for active x402 resources using a text query and optional filters.\nSupports both text-based and vector-based search depending on availability. Results are sorted by relevance and quality score.\nLegacy network names (e.g., `base`, `base-sepolia`, `solana`) are automatically normalized to their CAIP-2 equivalents.\nThe response is limited to 20 items per request. If more results exist, `partialResults` will be `true`.","operationId":"searchX402Resources","tags":["x402 Facilitator"],"security":[{"unauthenticated":[]}],"parameters":[{"name":"query","in":"query","description":"Full-text or semantic search query to find matching resources.","required":false,"schema":{"type":"string","maxLength":400,"example":"weather forecast"}},{"name":"network","in":"query","description":"Filter results by network in CAIP-2 format (e.g., `eip155:8453`) or legacy name (e.g., `base`, `base-sepolia`, `solana`).\nLegacy names are normalized to their CAIP-2 equivalents before filtering.","required":false,"schema":{"type":"string","example":"eip155:8453"}},{"name":"asset","in":"query","description":"Filter results by asset address.\nFor EVM networks, provide a 0x-prefixed EVM address. For Solana networks, provide a base58-encoded address.\nMatching is case-insensitive.","required":false,"schema":{"type":"string","example":"0x036CbD53842c5426634e7929541eC2318f3dCF7e"}},{"name":"scheme","in":"query","description":"Filter results by payment scheme (e.g., `exact`).","required":false,"schema":{"type":"string","example":"exact"}},{"name":"payTo","in":"query","description":"Filter results by the merchant's payment address.\nFor EVM networks, provide a 0x-prefixed EVM address. For Solana networks, provide a base58-encoded address.","required":false,"schema":{"$ref":"#/components/schemas/BlockchainAddress","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"}},{"name":"urlSubstring","in":"query","description":"Filter results to resources whose URL contains this value (case-insensitive substring match against the resource URL).\nUseful for narrowing results to a specific domain, subdomain, or path segment. Combine with `query` to perform semantic search restricted to a URL subset.\nTip: include enough of the URL to disambiguate (e.g. `api.example.com` rather than `example`) — a short substring may also match resources whose path contains the same string.","required":false,"schema":{"type":"string","minLength":3,"maxLength":2048,"example":"api.example.com"}},{"name":"maxUsdPrice","in":"query","description":"Filter results to resources with a USD price at or below this value.","required":false,"schema":{"type":"string","example":"1.00"}},{"name":"extensions","in":"query","description":"Filter results to resources that support the specified protocol extensions. Can be specified multiple times to filter by multiple extensions.","required":false,"schema":{"type":"array","items":{"type":"string"},"example":["bazaar"]},"style":"form","explode":true},{"name":"limit","in":"query","description":"Maximum number of resources to return. Must be a positive integer no greater than 20.\nDefaults to 20.","required":false,"schema":{"type":"integer","default":20,"maximum":20,"minimum":1},"example":20}],"responses":{"200":{"description":"Successfully retrieved matching x402 resources.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/x402SearchResourcesResponse"},"examples":{"search_results":{"value":{"x402Version":2,"resources":[{"resource":"https://api.example.com/weather/forecast","description":"Real-time weather forecast data.","type":"http","x402Version":2,"lastUpdated":"2024-01-15T10:30:00Z","extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET"}},"schema":{}}},"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"1000000","payTo":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","asset":"0x036CbD53842c5426634e7929541eC2318f3dCF7e","maxTimeoutSeconds":60}],"quality":{"l30DaysTotalCalls":42,"l30DaysUniquePayers":15,"lastCalledAt":"2024-01-15T10:30:00Z"}}],"partialResults":false,"searchMethod":"text"}}}}}},"400":{"description":"Invalid request parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"limit must be a positive integer."}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/x402/discovery/mcp":{"post":{"x-audience":"public","summary":"Handle MCP JSON-RPC request","description":"Handles JSON-RPC requests for the Model Context Protocol (MCP). Supports MCP methods for discovering x402 payment resources and tools.","operationId":"postX402DiscoveryMcp","tags":["x402 Facilitator"],"security":[{"unauthenticated":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/x402McpRequest"}}}},"responses":{"200":{"description":"MCP response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/x402McpResponse"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"Invalid JSON-RPC request. Please check the request format."}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/x402/validate":{"post":{"x-audience":"public","summary":"Validate x402 endpoint","description":"Validates an x402 endpoint's bazaar-discovery configuration by probing the seller's URL live.\nReturns a uniform array of preflight check results (reachable, returns402, hasBazaarExtension, parse) and a simulated facilitator accept/reject decision so sellers and agents can confirm their endpoint is ready to be discovered before going live.\nThis operation is read-only: it performs no payment and does not index the resource.","operationId":"validateX402Resource","tags":["x402 Facilitator"],"security":[{"unauthenticated":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/x402ValidateRequest"}}}},"responses":{"200":{"description":"Successfully validated the x402 endpoint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/x402ValidateResponse"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"Invalid request. resource is required and must be a valid HTTPS URL."}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"},"502":{"$ref":"#/components/responses/BadGatewayError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}},"/v2/onramp/verifications":{"post":{"x-audience":"public","summary":"Initiate onramp verification","description":"Initiates OTP verification by sending a 6-digit code to the user via the specified channel (SMS or email). Returns a `verificationId` that must be passed to the Submit Onramp Verification endpoint along with the OTP code within 10 minutes.\n\n**Access to this API requires allowlisting.** During Onramp Headless API onboarding, contact the Onramp team to enable Onramp-managed verification for your application.","operationId":"initiateOnrampVerification","tags":["Onramp"],"security":[{"apiKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InitiateOnrampVerificationRequest"}}}},"responses":{"201":{"description":"Successfully initiated onramp verification.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnrampVerificationInitiation"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"Invalid channel or destination."}}}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"422":{"$ref":"#/components/responses/IdempotencyError"},"429":{"$ref":"#/components/responses/RateLimitExceeded"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/onramp/verifications/{verificationId}/submit":{"post":{"x-audience":"public","summary":"Submit onramp verification","description":"Submits the OTP code to complete verification. On success, marks the verification as verified and returns the same `verificationId`. The destination does not need to be re-sent. Onramp uses the value captured at initiation time.\n\nThe returned `verificationId` should be stored on the user's device and passed to the Create Onramp Order endpoint. It is valid for 60 days.\n\n**Access to this API requires allowlisting.** During Onramp Headless API onboarding, contact the Onramp team to enable Onramp-managed verification for your application.","operationId":"submitOnrampVerification","tags":["Onramp"],"security":[{"apiKeyAuth":[]}],"parameters":[{"name":"verificationId","in":"path","required":true,"description":"The verification ID returned by the Initiate Onramp Verification endpoint.","schema":{"$ref":"#/components/schemas/OnrampVerificationId"},"example":"onramp_verification_a1b2c3d4-e5f6-7890-abcd-ef1234567890"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitOnrampVerificationRequest"}}}},"responses":{"200":{"description":"Successfully completed onramp verification.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnrampVerificationConfirmation"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"OTP code is required."}},"verification_code_invalid":{"value":{"errorType":"otp_verification_code_invalid","errorMessage":"The OTP code is incorrect or has expired."}},"verification_invalid":{"value":{"errorType":"otp_verification_invalid","errorMessage":"The verification record is not in a usable state for this operation."}}}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"description":"Verification not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"verification_not_found":{"value":{"errorType":"otp_verification_not_found","errorMessage":"The provided verification ID does not correspond to any verification record."}}}}}},"422":{"$ref":"#/components/responses/IdempotencyError"},"429":{"$ref":"#/components/responses/RateLimitExceeded"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/onramp/orders":{"post":{"x-audience":"public","summary":"Create an onramp order","description":"Create a new Onramp order or get a quote for an Onramp order. Either `paymentAmount` or `purchaseAmount` must be provided.\n\nThis API currently only supports the payment method `GUEST_CHECKOUT_APPLE_PAY`.\n\nFor detailed integration instructions and to get access to this API, refer to the  [Apple Pay Onramp API docs](https://docs.cdp.coinbase.com/onramp-&-offramp/onramp-apis/apple-pay-onramp-api).","operationId":"createOnrampOrder","tags":["Onramp"],"security":[{"apiKeyAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"agreementAcceptedAt":{"description":"The timestamp of when the user acknowledged that by using Coinbase Onramp they are accepting the Coinbase Terms  (https://www.coinbase.com/legal/guest-checkout/us), User Agreement (https://www.coinbase.com/legal/user_agreement),  and Privacy Policy (https://www.coinbase.com/legal/privacy).","format":"date-time","type":"string","example":"2025-04-24T00:00:00Z"},"destinationAddress":{"allOf":[{"$ref":"#/components/schemas/BlockchainAddress"}],"description":"The address the purchased crypto will be sent to."},"destinationNetwork":{"description":"The name of the crypto network the purchased currency will be sent on.\n\nUse the [Onramp Buy Options API](https://docs.cdp.coinbase.com/api-reference/rest-api/onramp-offramp/get-buy-options) to discover the supported networks for your user's location.","type":"string","example":"base"},"email":{"description":"The verified email address of the user requesting the onramp transaction. This email must be verified by your app (via OTP) before being used with the Onramp API.","type":"string","example":"test@example.com"},"isQuote":{"description":"If true, this API will return a quote without creating any transaction.","type":"boolean","default":false},"partnerOrderRef":{"description":"Optional partner order reference ID.","type":"string","example":"order-1234"},"partnerUserRef":{"description":"A unique string that represents the user in your app. This can be used to link individual transactions  together so you can retrieve the transaction history for your users. Prefix this string with “sandbox-”  (e.g. \"sandbox-user-1234\") to perform a sandbox transaction which will allow you to test your integration  without any real transfer of funds.\n\nThis value can be used with with [Onramp User Transactions API](https://docs.cdp.coinbase.com/api-reference/rest-api/onramp-offramp/get-onramp-transactions-by-id) to retrieve all transactions created by the user.","type":"string","example":"user-1234"},"paymentAmount":{"description":"A string representing the amount of fiat the user wishes to pay in exchange for crypto. When using  this parameter, the returned quote will be inclusive of fees i.e. the user will pay this exact amount  of the payment currency.","type":"string","example":"100.00"},"paymentCurrency":{"description":"The fiat currency to be converted to crypto.","type":"string","example":"USD"},"paymentMethod":{"$ref":"#/components/schemas/OnrampOrderPaymentMethodTypeId"},"phoneNumber":{"description":"The phone number of the user requesting the onramp transaction in E.164 format. This phone number must  be verified by your app (via OTP) before being used with the Onramp API.\n\nPlease refer to the [Onramp docs](https://docs.cdp.coinbase.com/onramp-&-offramp/onramp-apis/apple-pay-onramp-api) for more details on phone number verification requirements and best practices.","type":"string","example":"+12055555555"},"phoneNumberVerifiedAt":{"description":"Timestamp of when the user's phone number was verified via OTP. User phone number must be verified  every 60 days. If this timestamp is older than 60 days, an error will be returned.","format":"date-time","type":"string","example":"2025-04-24T00:00:00Z"},"smsVerificationId":{"allOf":[{"$ref":"#/components/schemas/OnrampVerificationId"}],"description":"The SMS verification ID returned by the Submit Onramp Verification endpoint after verifying the user's phone number. When provided, Onramp validates the server-side verification record instead of trusting `phoneNumberVerifiedAt`."},"emailVerificationId":{"allOf":[{"$ref":"#/components/schemas/OnrampVerificationId"}],"description":"The email verification ID returned by the Submit Onramp Verification endpoint after verifying the user's email address."},"purchaseAmount":{"description":"A string representing the amount of crypto the user wishes to purchase. When using this parameter the  returned quote will be exclusive of fees i.e. the user will receive this exact amount of the purchase  currency.","type":"string","example":"10.000000"},"purchaseCurrency":{"description":"The ticker (e.g. `BTC`, `USDC`, `SOL`) or the Coinbase UUID (e.g. `d85dce9b-5b73-5c3c-8978-522ce1d1c1b4`)  of the crypto asset to be purchased.\n\nUse the [Onramp Buy Options API](https://docs.cdp.coinbase.com/api-reference/rest-api/onramp-offramp/get-buy-options) to discover the supported purchase currencies for your user's location.","type":"string","example":"USDC"},"clientIp":{"description":"The IP address of the end user requesting the onramp transaction.","type":"string","example":"127.0.0.1"},"domain":{"description":"The domain that the Apple Pay button will be rendered on. Required when using the `GUEST_CHECKOUT_APPLE_PAY`  payment method and embedding the payment link in an iframe.","type":"string","example":"pay.coinbase.com"}},"required":["paymentCurrency","purchaseCurrency","paymentMethod","destinationAddress","destinationNetwork","phoneNumber","email","agreementAcceptedAt","phoneNumberVerifiedAt","partnerUserRef"]}}}},"responses":{"201":{"description":"Successfully created an onramp order.","content":{"application/json":{"schema":{"type":"object","properties":{"order":{"$ref":"#/components/schemas/OnrampOrder"},"paymentLink":{"$ref":"#/components/schemas/OnrampPaymentLink"}},"required":["order"]}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"Missing required params."}},"network_not_tradable":{"value":{"errorType":"network_not_tradable","errorMessage":"The selected asset cannot be purchased on the selected network in the user's location."}},"guest_permission_denied":{"value":{"errorType":"guest_permission_denied","errorMessage":"The user is not allowed to complete onramp transactions as a guest."}},"guest_region_forbidden":{"value":{"errorType":"guest_region_forbidden","errorMessage":"Guest onramp transactions are not allowed in the user's region."}},"phone_number_verification_expired":{"value":{"errorType":"phone_number_verification_expired","errorMessage":"The user's phone number verification has expired. Please re-verify the user's phone number."}},"verification_expired":{"value":{"errorType":"otp_verification_expired","errorMessage":"The verification record has expired. Initiate a new verification flow."}},"verification_invalid":{"value":{"errorType":"otp_verification_invalid","errorMessage":"The verification record is not in a valid state for order placement."}},"verification_required":{"value":{"errorType":"otp_verification_required","errorMessage":"Verification is required for this application. Use the Onramp Verification API to verify the user's phone number and email."}},"verification_destination_mismatch":{"value":{"errorType":"otp_verification_destination_mismatch","errorMessage":"The destination on the order does not match the destination that was verified."}}}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"404":{"description":"Verification not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"verification_not_found":{"value":{"errorType":"otp_verification_not_found","errorMessage":"The provided verification ID does not correspond to any verification record."}}}}}},"429":{"description":"Rate limit or guest transaction quota exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"rate_limit_exceeded":{"value":{"errorType":"rate_limit_exceeded","errorMessage":"Rate limit exceeded."}},"guest_transaction_limit":{"value":{"errorType":"guest_transaction_limit","errorMessage":"This transaction would exceed the user's weekly guest onramp transaction limit."}},"guest_transaction_count":{"value":{"errorType":"guest_transaction_count","errorMessage":"The user has reached the lifetime guest onramp transaction count limit (15)."}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/onramp/orders/{orderId}":{"get":{"x-audience":"public","summary":"Get an onramp order by ID","description":"Get an onramp order by ID.","operationId":"getOnrampOrderById","tags":["Onramp"],"security":[{"apiKeyAuth":[]}],"parameters":[{"name":"orderId","in":"path","required":true,"description":"The ID of the onramp order to retrieve.","schema":{"type":"string","pattern":"^[a-f0-9\\-]{36}$"},"example":"123e4567-e89b-12d3-a456-426614174000"}],"responses":{"200":{"description":"Successfully retrieved an onramp order.","content":{"application/json":{"schema":{"type":"object","properties":{"order":{"$ref":"#/components/schemas/OnrampOrder"}},"required":["order"]}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"404":{"description":"Order not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"Order with the given ID does not exist."}}}}}},"429":{"$ref":"#/components/responses/RateLimitExceeded"}}}},"/v2/onramp/sessions":{"post":{"x-audience":"public","summary":"Create an onramp session","description":"Returns a single-use URL for an Onramp session. This API provides flexible  functionality based on the parameters provided, supporting three cases:\n\n**Important**: The returned URL is single-use only. Once a user visits the URL,  no one else can access it.\n## Use Cases\n### 1. Basic Session (Minimum Parameters)\n**Required**: `destinationAddress`, `purchaseCurrency`, `destinationNetwork`\n\n**Returns**: Basic single-use onramp URL. The `quote` object will not be included in the response.\n### 2. One-Click Onramp URL\n**Required**: Basic parameters + (`paymentAmount` OR `purchaseAmount`), `paymentCurrency`\n\n**Returns**: One-click onramp URL for streamlined checkout. The `quote` object will not be included in the response.\n### 3. One-Click Onramp URL with Quote\n**Required**: One-Click Onramp parameters + `paymentMethod`, `country`, `subdivision`\n\n**Returns**: Complete pricing quote and one-click onramp URL. Both `session` and `quote` objects will be included in the response.\n\n**Note**: Only one of `paymentAmount` or `purchaseAmount` should be provided, not both. Providing both will result in an error. When `paymentAmount` is provided, the quote shows how much crypto the user will receive for the specified fiat amount (fee-inclusive). When `purchaseAmount` is provided, the quote shows how much fiat the user needs to pay for the specified crypto amount (fee-exclusive).","operationId":"createOnrampSession","tags":["Onramp"],"security":[{"apiKeyAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnrampSessionRequest"}}}},"responses":{"201":{"description":"Onramp session created successfully.","content":{"application/json":{"schema":{"type":"object","properties":{"session":{"$ref":"#/components/schemas/OnrampSession"},"quote":{"$ref":"#/components/schemas/OnrampQuote"}},"required":["session"]}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"Missing required parameters."}},"invalid_destination_address":{"value":{"errorType":"invalid_request","errorMessage":"The destination address is not valid for the specified network."}}}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"429":{"$ref":"#/components/responses/RateLimitExceeded"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/onramp/limits":{"post":{"summary":"Get onramp user limits","x-audience":"public","description":"Returns the transaction limits for an onramp user based on their payment method and user identifier. Use this API to show users their remaining purchase capacity before initiating an onramp transaction.\nCurrently supports `GUEST_CHECKOUT_APPLE_PAY` payment method with phone number identification. The phone number must have been previously verified via OTP.","operationId":"getOnrampUserLimits","tags":["Onramp"],"security":[{"apiKeyAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"paymentMethodType":{"$ref":"#/components/schemas/OnrampOrderPaymentMethodTypeId"},"userId":{"type":"string","description":"The user identifier value. For `phone_number` type, this must be in E.164 format.","example":"+12055555555"},"userIdType":{"$ref":"#/components/schemas/OnrampUserIdType"}},"required":["paymentMethodType","userId","userIdType"]}}}},"responses":{"200":{"description":"Successfully retrieved user limits.","content":{"application/json":{"schema":{"type":"object","properties":{"limits":{"type":"array","description":"The list of limits applicable to the user.","items":{"$ref":"#/components/schemas/OnrampUserLimit"}}},"required":["limits"]},"examples":{"default":{"value":{"limits":[{"limitType":"weekly_spending","currency":"USD","limit":"500","remaining":"400"},{"limitType":"lifetime_transactions","limit":"15","remaining":"12"}]}}}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"Must provide a valid payment method type and user identifier."}}}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"429":{"$ref":"#/components/responses/RateLimitExceeded"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/onramp/limits/upgrade":{"post":{"summary":"Request limit upgrade","x-audience":"public","description":"Requests a limit upgrade for an onramp user by submitting identity information. Only phone number is currently supported as a userId. \n\nThe verification process is asynchronous. After calling this endpoint, use the [Get Onramp User Limits](https://docs.cdp.coinbase.com/api-reference/v2/rest-api/onramp/get-onramp-user-limits) endpoint to check the status in the `limitUpgradeOptions` array.\n\n**Prerequisites:**\n- The phone number must have been previously verified by your app via OTP. - Upgrades may not be available until a certain number of successful transactions by the user.\n\n**Supported fields:**\n- `ssnLast4`: Last 4 digits of the Social Security Number (no dashes or spaces).\n- `dateOfBirth`: Date of birth (day, month, year as zero-padded strings).","operationId":"requestLimitsUpgrade","tags":["Onramp"],"security":[{"apiKeyAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnrampLimitUpgradeRequest"},"example":{"userId":"+12055555555","userIdType":"phone_number","fields":{"ssnLast4":"5678","dateOfBirth":{"day":"15","month":"08","year":"1990"}}}}}},"responses":{"202":{"description":"Limit upgrade request accepted."},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"Invalid user identifier or fields."}}}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"429":{"$ref":"#/components/responses/RateLimitExceeded"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/payment-methods":{"get":{"x-audience":"public","summary":"List payment methods","description":"List payment methods linked to your entity. Payment methods represent external financial instruments that can be used as a target for transfers. The list will not include disabled or deleted payment methods.\n\n**Currently Supported Types:**\n- `fedwire`: Domestic USD wire transfers\n- `swift`: International wire transfers\n- `sepa`: SEPA EUR transfers\n\n**Note:** Payment methods are created and verified through your linked CDP entity. Currently, fetching payment methods is only supported for Prime investment vehicles linked to CDP.","operationId":"listPaymentMethods","tags":["Payment Methods"],"security":[{"apiKeyAuth":[]}],"x-required-permissions":{"permissions":["accounts:read@entity"],"enforcement":"any"},"parameters":[{"$ref":"#/components/parameters/PageSize"},{"$ref":"#/components/parameters/PageToken"}],"responses":{"200":{"description":"Successfully listed payment methods.","content":{"application/json":{"schema":{"allOf":[{"type":"object","required":["paymentMethods"],"properties":{"paymentMethods":{"type":"array","description":"The list of payment methods.","items":{"$ref":"#/components/schemas/payment-methods_PaymentMethod"}}}},{"$ref":"#/components/schemas/ListResponse"}]},"example":{"paymentMethods":[{"paymentMethodId":"paymentMethod_8e03978e-40d5-43e8-bc93-6894a57f9324","paymentRail":"fedwire","active":true,"createdAt":"2024-01-15T10:30:00Z","updatedAt":"2024-01-15T10:30:00Z","fedwire":{"asset":"usd","bankName":"ALLY BANK","accountLast4":"1234","routingNumber":"124003116"}},{"paymentMethodId":"paymentMethod_def45678-1234-5678-9abc-def012345678","paymentRail":"swift","active":true,"createdAt":"2024-01-15T10:30:00Z","updatedAt":"2024-01-15T10:30:00Z","swift":{"asset":"eur","bankName":"Deutsche Bank","accountLast4":"5678","ibanLast4":"5678","bic":"DEUTDEFF"}},{"paymentMethodId":"paymentMethod_abc12345-6789-0abc-def0-123456789abc","paymentRail":"sepa","active":true,"createdAt":"2024-01-15T10:30:00Z","updatedAt":"2024-01-15T10:30:00Z","sepa":{"asset":"eur","bankName":"ING Bank","ibanLast4":"4300","bic":"INGBNL2A"}}],"nextPageToken":"eyJsYXN0X2lkIjogImFiYzEyMyJ9"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"Invalid page token format."}}}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/payment-methods/{paymentMethodId}":{"get":{"x-audience":"public","summary":"Get payment method","description":"Get details of a specific payment method by its ID. Returns 404 if the payment method is not found or not owned by the requesting entity.","operationId":"getPaymentMethod","security":[{"apiKeyAuth":[]}],"x-required-permissions":{"permissions":["accounts:read@entity"],"enforcement":"any"},"tags":["Payment Methods"],"parameters":[{"name":"paymentMethodId","in":"path","required":true,"description":"The unique identifier of the payment method.","schema":{"$ref":"#/components/schemas/PaymentMethodId"},"example":"paymentMethod_8e03978e-40d5-43e8-bc93-6894a57f9324"}],"responses":{"200":{"description":"Successfully retrieved payment method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/payment-methods_PaymentMethod"},"examples":{"fedwire":{"summary":"Fedwire payment method","value":{"paymentMethodId":"paymentMethod_8e03978e-40d5-43e8-bc93-6894a57f9324","paymentRail":"fedwire","active":true,"createdAt":"2024-01-15T10:30:00Z","updatedAt":"2024-01-15T10:30:00Z","fedwire":{"asset":"usd","bankName":"ALLY BANK","accountLast4":"1234","routingNumber":"124003116"}}},"swift":{"summary":"SWIFT payment method","value":{"paymentMethodId":"paymentMethod_def45678-1234-5678-9abc-def012345678","paymentRail":"swift","active":true,"createdAt":"2024-01-15T10:30:00Z","updatedAt":"2024-01-15T10:30:00Z","swift":{"asset":"eur","bankName":"Deutsche Bank","accountLast4":"5678","ibanLast4":"5678","bic":"DEUTDEFF"}}},"sepa":{"summary":"SEPA payment method","value":{"paymentMethodId":"paymentMethod_abc12345-6789-0abc-def0-123456789abc","paymentRail":"sepa","active":true,"createdAt":"2024-01-15T10:30:00Z","updatedAt":"2024-01-15T10:30:00Z","sepa":{"asset":"eur","bankName":"ING Bank","ibanLast4":"4300","bic":"INGBNL2A"}}}}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"value":{"errorType":"invalid_request","errorMessage":"Invalid payment method ID format."}}}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"404":{"description":"Payment method not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"not_found":{"value":{"errorType":"not_found","errorMessage":"Payment method not found."}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"}}}}},"webhooks":{"onchainActivityDetected":{"post":{"summary":"Onchain activity detected","description":"Triggered when onchain activity matching your subscription filters is detected. Your API will receive a POST request at the webhook URL you configured. Use `labels` on your webhook subscription to filter which onchain events are delivered (see the Create Webhook Subscription endpoint for allowed labels).","operationId":"onchainActivityDetectedWebhook","security":[{"webhookSignature":[]}],"x-audience":"public","tags":["Onchain Data"],"requestBody":{"description":"The decoded blockchain event data. Payload shape varies by the type of onchain activity detected (token transfer, contract interaction, etc.).","required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnchainActivityDetectedEvent"},"examples":{"erc20_transfer":{"summary":"ERC-20 token transfer detected","value":{"block_number":46218191,"contract_address":"0x940181a94A35A4569E4529A3CDfB74e38FD98631","event_name":"Transfer","event_signature":"Transfer(address,address,uint256)","log_index":29,"network":"base-mainnet","parameters":{"from":"0xF33a96b5932D9E9B9A0eDA447AbD8C9d48d2e0c8","to":"0x61040E143A77F165Ba44543AF4A079F2C809D14b","value":"474891138228179365"},"timestamp":"2026-05-19T21:22:10Z","transaction_from":"0x3E16D476D8Df15e3E776EAa5A46f37EC44C830cD","transaction_hash":"0xa58e4471bcce875b1ea49cc0864a620d3a484b9b7c1b0b4fd18ce83f5b30e5e0","transaction_to":"0x61040E143A77F165Ba44543AF4A079F2C809D14b"}}}}}},"responses":{"200":{"description":"Webhook received and processed successfully. Return a 200 status code to acknowledge receipt. If your endpoint does not return a 2xx status code, the webhook will be retried with exponential backoff."},"401":{"description":"Invalid signature. The webhook signature verification failed."}}}},"walletActivityDetected":{"post":{"summary":"Wallet activity detected","description":"Triggered when the `wallet.activity.detected` webhook event is emitted. Your API will receive a POST request at the webhook URL you configured.","operationId":"walletActivityDetectedWebhook","security":[{"webhookSignature":[]}],"x-audience":"public","tags":["Onchain Data"],"requestBody":{"description":"The `wallet.activity.detected` webhook event payload.","required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletActivityDetectedEvent"}}}},"responses":{"200":{"description":"Webhook received and processed successfully."},"401":{"description":"Invalid signature."}}}},"walletActivityMulti":{"post":{"summary":"Wallet activity multi","description":"Triggered when the `wallet.activity.multi` webhook event is emitted. Your API will receive a POST request at the webhook URL you configured.","operationId":"walletActivityMultiWebhook","security":[{"webhookSignature":[]}],"x-audience":"public","tags":["Onchain Data"],"requestBody":{"description":"The `wallet.activity.multi` webhook event payload.","required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletActivityMultiEvent"}}}},"responses":{"200":{"description":"Webhook received and processed successfully."},"401":{"description":"Invalid signature."}}}},"walletTransactionCreated":{"post":{"summary":"Wallet transaction created","description":"Triggered when the `wallet.transaction.created` webhook event is emitted. Your API will receive a POST request at the webhook URL you configured.","operationId":"walletTransactionCreatedWebhook","security":[{"webhookSignature":[]}],"x-audience":"public","tags":["Wallet Webhooks"],"requestBody":{"description":"The `wallet.transaction.created` webhook event payload.","required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletTransactionCreatedEvent"}}}},"responses":{"200":{"description":"Webhook received and processed successfully."},"401":{"description":"Invalid signature."}}}},"walletTransactionSigned":{"post":{"summary":"Wallet transaction signed","description":"Triggered when the `wallet.transaction.signed` webhook event is emitted. Your API will receive a POST request at the webhook URL you configured.","operationId":"walletTransactionSignedWebhook","security":[{"webhookSignature":[]}],"x-audience":"public","tags":["Wallet Webhooks"],"requestBody":{"description":"The `wallet.transaction.signed` webhook event payload.","required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletTransactionSignedEvent"}}}},"responses":{"200":{"description":"Webhook received and processed successfully."},"401":{"description":"Invalid signature."}}}},"walletTransactionBroadcast":{"post":{"summary":"Wallet transaction broadcast","description":"Triggered when the `wallet.transaction.broadcast` webhook event is emitted. Your API will receive a POST request at the webhook URL you configured.","operationId":"walletTransactionBroadcastWebhook","security":[{"webhookSignature":[]}],"x-audience":"public","tags":["Wallet Webhooks"],"requestBody":{"description":"The `wallet.transaction.broadcast` webhook event payload.","required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletTransactionBroadcastEvent"}}}},"responses":{"200":{"description":"Webhook received and processed successfully."},"401":{"description":"Invalid signature."}}}},"walletTransactionReplaced":{"post":{"summary":"Wallet transaction replaced","description":"Triggered when the `wallet.transaction.replaced` webhook event is emitted. Your API will receive a POST request at the webhook URL you configured.","operationId":"walletTransactionReplacedWebhook","security":[{"webhookSignature":[]}],"x-audience":"public","tags":["Wallet Webhooks"],"requestBody":{"description":"The `wallet.transaction.replaced` webhook event payload.","required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletTransactionReplacedEvent"}}}},"responses":{"200":{"description":"Webhook received and processed successfully."},"401":{"description":"Invalid signature."}}}},"walletTransactionPending":{"post":{"summary":"Wallet transaction pending","description":"Triggered when the `wallet.transaction.pending` webhook event is emitted. Your API will receive a POST request at the webhook URL you configured.","operationId":"walletTransactionPendingWebhook","security":[{"webhookSignature":[]}],"x-audience":"public","tags":["Wallet Webhooks"],"requestBody":{"description":"The `wallet.transaction.pending` webhook event payload.","required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletTransactionPendingEvent"}}}},"responses":{"200":{"description":"Webhook received and processed successfully."},"401":{"description":"Invalid signature."}}}},"walletTransactionConfirmed":{"post":{"summary":"Wallet transaction confirmed","description":"Triggered when the `wallet.transaction.confirmed` webhook event is emitted. Your API will receive a POST request at the webhook URL you configured.","operationId":"walletTransactionConfirmedWebhook","security":[{"webhookSignature":[]}],"x-audience":"public","tags":["Wallet Webhooks"],"requestBody":{"description":"The `wallet.transaction.confirmed` webhook event payload.","required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletTransactionConfirmedEvent"}}}},"responses":{"200":{"description":"Webhook received and processed successfully."},"401":{"description":"Invalid signature."}}}},"walletTransactionFailed":{"post":{"summary":"Wallet transaction failed","description":"Triggered when the `wallet.transaction.failed` webhook event is emitted. Your API will receive a POST request at the webhook URL you configured.","operationId":"walletTransactionFailedWebhook","security":[{"webhookSignature":[]}],"x-audience":"public","tags":["Wallet Webhooks"],"requestBody":{"description":"The `wallet.transaction.failed` webhook event payload.","required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletTransactionFailedEvent"}}}},"responses":{"200":{"description":"Webhook received and processed successfully."},"401":{"description":"Invalid signature."}}}},"walletDelegationCreated":{"post":{"summary":"Wallet delegation created","description":"Triggered when the `wallet.delegation.created` webhook event is emitted. Your API will receive a POST request at the webhook URL you configured.","operationId":"walletDelegationCreatedWebhook","security":[{"webhookSignature":[]}],"x-audience":"public","tags":["Wallet Webhooks"],"requestBody":{"description":"The `wallet.delegation.created` webhook event payload.","required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletDelegationCreatedEvent"}}}},"responses":{"200":{"description":"Webhook received and processed successfully."},"401":{"description":"Invalid signature."}}}},"walletDelegationRevoked":{"post":{"summary":"Wallet delegation revoked","description":"Triggered when the `wallet.delegation.revoked` webhook event is emitted. Your API will receive a POST request at the webhook URL you configured.","operationId":"walletDelegationRevokedWebhook","security":[{"webhookSignature":[]}],"x-audience":"public","tags":["Wallet Webhooks"],"requestBody":{"description":"The `wallet.delegation.revoked` webhook event payload.","required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletDelegationRevokedEvent"}}}},"responses":{"200":{"description":"Webhook received and processed successfully."},"401":{"description":"Invalid signature."}}}},"walletTypedDataSigned":{"post":{"summary":"Wallet typed data signed","description":"Triggered when the `wallet.typed_data.signed` webhook event is emitted. Your API will receive a POST request at the webhook URL you configured.","operationId":"walletTypedDataSignedWebhook","security":[{"webhookSignature":[]}],"x-audience":"public","tags":["Wallet Webhooks"],"requestBody":{"description":"The `wallet.typed_data.signed` webhook event payload.","required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletTypedDataSignedEvent"}}}},"responses":{"200":{"description":"Webhook received and processed successfully."},"401":{"description":"Invalid signature."}}}},"walletMessageSigned":{"post":{"summary":"Wallet message signed","description":"Triggered when the `wallet.message.signed` webhook event is emitted. Your API will receive a POST request at the webhook URL you configured.","operationId":"walletMessageSignedWebhook","security":[{"webhookSignature":[]}],"x-audience":"public","tags":["Wallet Webhooks"],"requestBody":{"description":"The `wallet.message.signed` webhook event payload.","required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletMessageSignedEvent"}}}},"responses":{"200":{"description":"Webhook received and processed successfully."},"401":{"description":"Invalid signature."}}}},"walletHashSigned":{"post":{"summary":"Wallet hash signed","description":"Triggered when the `wallet.hash.signed` webhook event is emitted. Your API will receive a POST request at the webhook URL you configured.","operationId":"walletHashSignedWebhook","security":[{"webhookSignature":[]}],"x-audience":"public","tags":["Wallet Webhooks"],"requestBody":{"description":"The `wallet.hash.signed` webhook event payload.","required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletHashSignedEvent"}}}},"responses":{"200":{"description":"Webhook received and processed successfully."},"401":{"description":"Invalid signature."}}}},"paymentsTransfersQuoted":{"post":{"summary":"Payments transfers quoted","description":"Triggered when the `payments.transfers.quoted` webhook event is emitted. Your API will receive a POST request at the webhook URL you configured.","operationId":"paymentsTransfersQuotedWebhook","security":[{"webhookSignature":[]}],"x-audience":"public","tags":["Transfers"],"requestBody":{"description":"The `payments.transfers.quoted` webhook event payload.","required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentsTransfersQuotedEvent"}}}},"responses":{"200":{"description":"Webhook received and processed successfully."},"401":{"description":"Invalid signature."}}}},"paymentsTransfersProcessing":{"post":{"summary":"Payments transfers processing","description":"Triggered when the `payments.transfers.processing` webhook event is emitted. Your API will receive a POST request at the webhook URL you configured.","operationId":"paymentsTransfersProcessingWebhook","security":[{"webhookSignature":[]}],"x-audience":"public","tags":["Transfers"],"requestBody":{"description":"The `payments.transfers.processing` webhook event payload.","required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentsTransfersProcessingEvent"}}}},"responses":{"200":{"description":"Webhook received and processed successfully."},"401":{"description":"Invalid signature."}}}},"paymentsTransfersCompleted":{"post":{"summary":"Payments transfers completed","description":"Triggered when the `payments.transfers.completed` webhook event is emitted. Your API will receive a POST request at the webhook URL you configured.","operationId":"paymentsTransfersCompletedWebhook","security":[{"webhookSignature":[]}],"x-audience":"public","tags":["Transfers"],"requestBody":{"description":"The `payments.transfers.completed` webhook event payload.","required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentsTransfersCompletedEvent"}}}},"responses":{"200":{"description":"Webhook received and processed successfully."},"401":{"description":"Invalid signature."}}}},"paymentsTransfersFailed":{"post":{"summary":"Payments transfers failed","description":"Triggered when the `payments.transfers.failed` webhook event is emitted. Your API will receive a POST request at the webhook URL you configured.","operationId":"paymentsTransfersFailedWebhook","security":[{"webhookSignature":[]}],"x-audience":"public","tags":["Transfers"],"requestBody":{"description":"The `payments.transfers.failed` webhook event payload.","required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentsTransfersFailedEvent"}}}},"responses":{"200":{"description":"Webhook received and processed successfully."},"401":{"description":"Invalid signature."}}}},"paymentsTransfersExpired":{"post":{"summary":"Payments transfers expired","description":"Triggered when the `payments.transfers.expired` webhook event is emitted. Your API will receive a POST request at the webhook URL you configured.","operationId":"paymentsTransfersExpiredWebhook","security":[{"webhookSignature":[]}],"x-audience":"public","tags":["Transfers"],"requestBody":{"description":"The `payments.transfers.expired` webhook event payload.","required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentsTransfersExpiredEvent"}}}},"responses":{"200":{"description":"Webhook received and processed successfully."},"401":{"description":"Invalid signature."}}}},"paymentsTransfersTravelRuleIncomplete":{"post":{"summary":"Payments transfers travel rule incomplete","description":"Triggered when the `payments.transfers.travel_rule_incomplete` webhook event is emitted. Your API will receive a POST request at the webhook URL you configured.","operationId":"paymentsTransfersTravelRuleIncompleteWebhook","security":[{"webhookSignature":[]}],"x-audience":"public","tags":["Transfers"],"requestBody":{"description":"The `payments.transfers.travel_rule_incomplete` webhook event payload.","required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentsTransfersTravelRuleIncompleteEvent"}}}},"responses":{"200":{"description":"Webhook received and processed successfully."},"401":{"description":"Invalid signature."}}}},"paymentsTransfersTravelRuleCompleted":{"post":{"summary":"Payments transfers travel rule completed","description":"Triggered when the `payments.transfers.travel_rule_completed` webhook event is emitted. Your API will receive a POST request at the webhook URL you configured.","operationId":"paymentsTransfersTravelRuleCompletedWebhook","security":[{"webhookSignature":[]}],"x-audience":"public","tags":["Transfers"],"requestBody":{"description":"The `payments.transfers.travel_rule_completed` webhook event payload.","required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentsTransfersTravelRuleCompletedEvent"}}}},"responses":{"200":{"description":"Webhook received and processed successfully."},"401":{"description":"Invalid signature."}}}},"onrampTransactionCreated":{"post":{"summary":"Onramp transaction created","description":"Triggered when the `onramp.transaction.created` webhook event is emitted. Your API will receive a POST request at the webhook URL you configured.","operationId":"onrampTransactionCreatedWebhook","security":[{"webhookSignature":[]}],"x-audience":"public","tags":["Onramp"],"requestBody":{"description":"The `onramp.transaction.created` webhook event payload.","required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnrampTransactionCreatedEvent"}}}},"responses":{"200":{"description":"Webhook received and processed successfully."},"401":{"description":"Invalid signature."}}}},"onrampTransactionUpdated":{"post":{"summary":"Onramp transaction updated","description":"Triggered when the `onramp.transaction.updated` webhook event is emitted. Your API will receive a POST request at the webhook URL you configured.","operationId":"onrampTransactionUpdatedWebhook","security":[{"webhookSignature":[]}],"x-audience":"public","tags":["Onramp"],"requestBody":{"description":"The `onramp.transaction.updated` webhook event payload.","required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnrampTransactionUpdatedEvent"}}}},"responses":{"200":{"description":"Webhook received and processed successfully."},"401":{"description":"Invalid signature."}}}},"onrampTransactionSuccess":{"post":{"summary":"Onramp transaction succeeded","description":"Triggered when the `onramp.transaction.success` webhook event is emitted. Your API will receive a POST request at the webhook URL you configured.","operationId":"onrampTransactionSuccessWebhook","security":[{"webhookSignature":[]}],"x-audience":"public","tags":["Onramp"],"requestBody":{"description":"The `onramp.transaction.success` webhook event payload.","required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnrampTransactionSuccessEvent"}}}},"responses":{"200":{"description":"Webhook received and processed successfully."},"401":{"description":"Invalid signature."}}}},"onrampTransactionFailed":{"post":{"summary":"Onramp transaction failed","description":"Triggered when the `onramp.transaction.failed` webhook event is emitted. Your API will receive a POST request at the webhook URL you configured.","operationId":"onrampTransactionFailedWebhook","security":[{"webhookSignature":[]}],"x-audience":"public","tags":["Onramp"],"requestBody":{"description":"The `onramp.transaction.failed` webhook event payload.","required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnrampTransactionFailedEvent"}}}},"responses":{"200":{"description":"Webhook received and processed successfully."},"401":{"description":"Invalid signature."}}}},"offrampTransactionCreated":{"post":{"summary":"Offramp transaction created","description":"Triggered when the `offramp.transaction.created` webhook event is emitted. Your API will receive a POST request at the webhook URL you configured.","operationId":"offrampTransactionCreatedWebhook","security":[{"webhookSignature":[]}],"x-audience":"public","tags":["Onramp"],"requestBody":{"description":"The `offramp.transaction.created` webhook event payload.","required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OfframpTransactionCreatedEvent"}}}},"responses":{"200":{"description":"Webhook received and processed successfully."},"401":{"description":"Invalid signature."}}}},"offrampTransactionUpdated":{"post":{"summary":"Offramp transaction updated","description":"Triggered when the `offramp.transaction.updated` webhook event is emitted. Your API will receive a POST request at the webhook URL you configured.","operationId":"offrampTransactionUpdatedWebhook","security":[{"webhookSignature":[]}],"x-audience":"public","tags":["Onramp"],"requestBody":{"description":"The `offramp.transaction.updated` webhook event payload.","required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OfframpTransactionUpdatedEvent"}}}},"responses":{"200":{"description":"Webhook received and processed successfully."},"401":{"description":"Invalid signature."}}}},"offrampTransactionSuccess":{"post":{"summary":"Offramp transaction succeeded","description":"Triggered when the `offramp.transaction.success` webhook event is emitted. Your API will receive a POST request at the webhook URL you configured.","operationId":"offrampTransactionSuccessWebhook","security":[{"webhookSignature":[]}],"x-audience":"public","tags":["Onramp"],"requestBody":{"description":"The `offramp.transaction.success` webhook event payload.","required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OfframpTransactionSuccessEvent"}}}},"responses":{"200":{"description":"Webhook received and processed successfully."},"401":{"description":"Invalid signature."}}}},"offrampTransactionFailed":{"post":{"summary":"Offramp transaction failed","description":"Triggered when the `offramp.transaction.failed` webhook event is emitted. Your API will receive a POST request at the webhook URL you configured.","operationId":"offrampTransactionFailedWebhook","security":[{"webhookSignature":[]}],"x-audience":"public","tags":["Onramp"],"requestBody":{"description":"The `offramp.transaction.failed` webhook event payload.","required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OfframpTransactionFailedEvent"}}}},"responses":{"200":{"description":"Webhook received and processed successfully."},"401":{"description":"Invalid signature."}}}},"customersCapabilityChanged":{"post":{"summary":"Customers capability changed","description":"Triggered when the `customers.capability.changed` webhook event is emitted. Your API will receive a POST request at the webhook URL you configured.","operationId":"customersCapabilityChangedWebhook","security":[{"webhookSignature":[]}],"x-audience":"public","tags":["Customers"],"requestBody":{"description":"The `customers.capability.changed` webhook event payload.","required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomersCapabilityChangedEvent"}}}},"responses":{"200":{"description":"Webhook received and processed successfully."},"401":{"description":"Invalid signature."}}}},"customersCustomerDeleted":{"post":{"summary":"Customer deleted","description":"Triggered when the `customers.customer.deleted` webhook event is emitted. Your API will receive a POST request at the webhook URL you configured.","operationId":"customersCustomerDeletedWebhook","security":[{"webhookSignature":[]}],"x-audience":"public","tags":["Customers"],"requestBody":{"description":"The `customers.customer.deleted` webhook event payload.","required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomersCustomerDeletedEvent"}}}},"responses":{"200":{"description":"Webhook received and processed successfully."},"401":{"description":"Invalid signature."}}}}},"components":{"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."},"endUserAuth":{"x-audience":"public","type":"http","scheme":"bearer","bearerFormat":"JWT","description":"A JWT signed using the developer's own JWT private key (in the case of JWT authentication), or an end user JWT signed by CDP, encoded in base64. This is used for End User Account APIs."},"unauthenticated":{"x-audience":"public","type":"http","scheme":"none","description":"This security scheme is used for APIs that do not require authentication, such as End User Auth flows used to initiate authentication or public, read-only endpoints."},"webhookSignature":{"x-audience":"public","type":"apiKey","in":"header","name":"X-Hook0-Signature","description":"HMAC-SHA256 signature of the raw request body, computed using your webhook secret. Webhook receivers should always verify this header before processing the event. The header value is hex-encoded and prefixed by the algorithm and timestamp, e.g. `t=1700000000,v1=abc123...` (refer to the Webhook Security docs for the exact verification algorithm).\n\nThis scheme applies to webhook delivery (outbound POSTs from CDP to your endpoint), not to inbound CDP API requests."}},"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=="},"IdempotencyKey":{"name":"X-Idempotency-Key","in":"header","required":false,"description":"An optional string request header for making requests safely retryable.\nWhen included, duplicate requests with the same key will return identical responses.\nRefer to our [Idempotency docs](https://docs.cdp.coinbase.com/api-reference/v2/idempotency) for more information on using idempotency keys.\n","schema":{"type":"string","maxLength":128,"minLength":1},"example":"8e03978e-40d5-43e8-bc93-6894a57f9324"},"XWalletAuth":{"name":"X-Wallet-Auth","in":"header","required":true,"description":"A JWT signed using your Wallet Secret, encoded in base64. Refer to the\n[Generate Wallet Token](https://docs.cdp.coinbase.com/api-reference/v2/authentication#2-generate-wallet-token)\nsection of our Authentication docs for more details on how to generate your Wallet Token.\n","schema":{"type":"string"},"example":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjEyMywicm9sZSI6ImFkbWluIiwiZXhwIjoxNzAxOTgwMDAwfQ.HWvMTKmCCTxHaxjvZyLaC6UQ6TV3ErTDWBf7zmdH0Lw"},"XWalletAuthOptional":{"name":"X-Wallet-Auth","in":"header","required":false,"description":"A JWT signed using your Wallet Secret, encoded in base64. Refer to the\n[Generate Wallet Token](https://docs.cdp.coinbase.com/api-reference/v2/authentication#2-generate-wallet-token)\nsection of our Authentication docs for more details on how to generate your Wallet Token.\n","schema":{"type":"string"},"example":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjEyMywicm9sZSI6ImFkbWluIiwiZXhwIjoxNzAxOTgwMDAwfQ.HWvMTKmCCTxHaxjvZyLaC6UQ6TV3ErTDWBf7zmdH0Lw"},"XDeveloperAuth":{"name":"X-Developer-Auth","in":"header","required":false,"description":"A JWT signed using your Wallet Secret, encoded in base64. Refer to the\n[Generate Wallet Token](https://docs.cdp.coinbase.com/api-reference/v2/authentication#2-generate-wallet-token)\nsection of our Authentication docs for more details on how to generate your Wallet Token.\n","schema":{"type":"string"},"example":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjEyMywicm9sZSI6ImFkbWluIiwiZXhwIjoxNzAxOTgwMDAwfQ.HWvMTKmCCTxHaxjvZyLaC6UQ6TV3ErTDWBf7zmdH0Lw"},"ProjectIDOptional":{"name":"projectID","in":"query","required":false,"description":"The ID of the CDP Project. Required for end users authenticated using custom auth (i.e. a non-CDP JWT provider).","schema":{"type":"string","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$","example":"8e03978e-40d5-43e8-bc93-6894a57f9324"}}},"schemas":{"AccountType":{"type":"string","description":"The type of the Account.\n\n- `prime`: a linked Coinbase Prime account.\n- `business`: a linked Coinbase Business account.\n- `cdp`: a CDP-native account created via this API. Used for accounts created on\n  behalf of an Entity and for Customer-owned accounts.","enum":["prime","business","cdp"],"example":"prime"},"AccountId":{"type":"string","pattern":"^account_[a-f0-9\\-]{36}$","description":"The ID of the Account, which is a UUID prefixed by the string `account_`.","example":"account_af2937b0-9846-4fe7-bfe9-ccc22d935114"},"Owner":{"type":"string","description":"The Owner ID of the Account.\n\nOwner IDs are UUIDs prefixed with the Owner Type as follows:\n\n* **Entity**: `entity_` - If the Owner is your Entity, e.g. `entity_af2937b0-9846-4fe7-bfe9-ccc22d935114`.\n\n* **Customer**: `customer_` - If the Owner is one of your Customers,\n  e.g. `customer_af2937b0-9846-4fe7-bfe9-ccc22d935114`. Customer ownership requires the\n  Customer to have the `custodyCrypto`, `custodyFiat`, and `custodyStablecoin`\n  capabilities enabled.","pattern":"^(entity|customer)_[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$","example":"entity_af2937b0-9846-4fe7-bfe9-ccc22d935114"},"AccountName":{"type":"string","pattern":"^[a-zA-Z0-9 -]{1,64}$","maxLength":64,"description":"An optional name for the account. Must be 1-64 characters and can only contain alphanumeric characters, hyphens, and spaces.","example":"My Business Account"},"Account":{"type":"object","properties":{"accountId":{"$ref":"#/components/schemas/AccountId"},"type":{"$ref":"#/components/schemas/AccountType"},"owner":{"$ref":"#/components/schemas/Owner"},"name":{"$ref":"#/components/schemas/AccountName"},"createdAt":{"type":"string","format":"date-time","description":"The timestamp when the account was created.","example":"2023-10-08T14:30:00Z"},"updatedAt":{"type":"string","format":"date-time","description":"The timestamp when the account was last updated.","example":"2023-10-08T14:30:00Z"}},"required":["accountId","type","owner","createdAt","updatedAt"]},"ListResponse":{"type":"object","properties":{"nextPageToken":{"type":"string","description":"The token for the next page of items, if any.","example":"eyJsYXN0X2lkIjogImFiYzEyMyIsICJ0aW1lc3RhbXAiOiAxNzA3ODIzNzAxfQ=="}}},"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.\n\n**Steps to resolve:**\n1. Check if the resource exists before creation\n2. Use GET endpoints to verify resource state\n3. 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.\n\n**Steps to resolve:**\n1. Retry your request after a short delay\n2. If persistent, contact CDP support with:\n   - The timestamp of the error\n   - Request details\n3. Consider implementing retry logic with an exponential backoff\n\n**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.\n\n**Common causes:**\n- The client timed out waiting for the server response\n- The client application was terminated during a pending request\n- Network interruption caused the client connection to drop\n\n**Steps to resolve:**\n1. Increase client-side timeout settings if applicable\n2. Implement retry logic with exponential backoff for long-running queries\n3. 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.\n\nRe-enabling is a manual operator action, so the endpoint may remain unavailable for an extended period.\n\n**Steps to resolve:**\n1. Check the [CDP status page](https://cdpstatus.coinbase.com/) for an active incident.\n2. If persistent, contact CDP support with:\n   - The timestamp of the error\n   - Request details","faucet_limit_exceeded":"This error occurs when you've exceeded the faucet request limits.\n\n**Steps to resolve:**\n1. Wait for the time window to reset\n2. Use funds more efficiently in your testing\n\nFor 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\nor more capabilities required to perform the requested action. This can\nhappen at any point in the customer's lifecycle and may or may not be\nresolvable by the developer.\n\nThe response includes an `unauthorizedCapabilities` field listing the\ncapability code(s) that were not authorized on this request.\n\n**Steps to resolve:**\n1. Fetch the customer with `GET /v2/customers/{customerId}` and inspect\n   the `requirements` field. If `requirements.due` is non-empty, submit\n   the listed fields via `PUT /v2/customers/{customerId}` and retry.\n2. If `requirements.due` is empty, no further action is available — the\n   customer is not currently eligible for this action.","forbidden":"This error occurs when you don't have permission to access the resource.\n\n**Steps to resolve:**\n1. Verify your permissions to access the resource\n2. Ensure that you are the owner of the requested resource","idempotency_error":"This error occurs when an idempotency key is reused with different parameters.\n\n**Steps to resolve:**\n1. Generate a new UUID v4 for each unique request\n2. Only reuse idempotency keys for exact request duplicates\n3. Track used keys within your application\n\n**Example idempotency key implementation:**\n```typescript lines wrap\nimport { v4 as uuidv4 } from 'uuid';\n\nfunction createIdempotencyKey() {\n  return uuidv4();\n}\n```","internal_server_error":"This indicates an unexpected error that occurred on the CDP servers.\n\n**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.\n\n**Steps to resolve:**\n1. Retry your request after a short delay\n2. If persistent, contact CDP support with:\n   - Your correlation ID\n   - Timestamp of the error\n   - Request details\n3. Consider implementing retry logic with an exponential backoff\n\n**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.\n\n**Steps to resolve:**\n1. Check all required fields and parameters are present\n2. Ensure request body (if applicable) follows the correct schema\n3. Verify all parameter formats match the API specification:\n   - Query parameters\n   - Path parameters\n   - Request headers\n4. Validate any addresses, IDs, or other formatted strings meet requirements\n\n**Common validation issues:**\n- Missing required parameters\n- Invalid parameter types or formats\n- Malformed JSON in request body\n- Invalid enum values\n\n#### Transfer-specific validation errors\n\nThe following transfer validation scenarios return `errorType: \"invalid_request\"`. Use the `errorMessage` field to identify the specific case.\n\n| Scenario | Example `errorMessage` |\n|----------|----------------------|\n| Source account ID is malformed | `\"source is invalid.\"` |\n| Target account ID is malformed | `\"target is invalid.\"` |\n| Source account does not exist | `\"source not found.\"` |\n| Target account does not exist | `\"target not found.\"` |\n| Asset not supported at source | `\"source is not supported.\"` |\n| Asset not supported at target | `\"target is not supported.\"` |\n| Target email address is malformed | `\"target has an invalid email format.\"` |\n| Target onchain address is invalid for network | `\"The recipient address is invalid for the selected network.\"` |\n| Asset not supported for this transfer route | `\"Transfer asset pair is not supported.\"` |\n| Insufficient balance | `\"Insufficient funds to complete this transfer.\"` |\n| Asset mismatch between request fields | `\"Currency mismatch in request.\"` |\n| Metadata has too many keys | `\"Metadata has too many keys. Up to 10 key/value pairs are permitted.\"` |\n| Metadata key exceeds length limit | `\"Metadata key is too long. Each key must be less than or equal to 40 characters.\"` |\n| Metadata value exceeds length limit | `\"Metadata value is too long. Each value must be less than or equal to 500 characters.\"` |\n| Travel rule fields missing | `\"Travel rule information is incomplete. Missing fields: ...\"` |\n| 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.\n\n**Common causes:**\n- Using non-SELECT SQL statements (INSERT, UPDATE, DELETE, etc.)\n- Invalid table or column names\n- Syntax errors in SQL query\n- Query exceeds character limit\n- Too many JOIN operations","invalid_signature":"This error occurs when the signature provided for the given user operation is invalid.\n\n**Steps to resolve:**\n1. Verify the signature was generated by the correct owner account\n2. Ensure the signature corresponds to the exact user operation hash\n3. Check that the signature format matches the expected format\n4. Confirm you're using the correct network for the Smart Account\n\n**Common causes:**\n- Using wrong owner account to sign\n- Signing modified/incorrect user operation data\n- Malformed signature encoding\n- Network mismatch between signature and broadcast","malformed_transaction":"This error occurs when the transaction data provided is not properly formatted or is invalid.\n\n**Steps to resolve:**\n1. Verify transaction encoding:\n   - **EVM networks**: Check RLP encoding is correct\n   - **Solana**: Validate base64 encoding\n2. Ensure all required transaction fields are present\n3. Validate transaction parameters are within acceptable ranges\n4. 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)\n\n**Common causes:**\n- Invalid hex encoding for EVM transactions\n- Missing required transaction fields\n- Incorrect parameter formats\n- Unsupported transaction types\n- 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.\n\n**Steps to resolve:**\n1. Verify the resource ID/address/account exists\n2. Check your permissions to access the resource\n3. Ensure you're using the correct network/environment\n4. Confirm the resource hasn't been deleted\n\n**Common causes:**\n- Mistyped addresses\n- Accessing resources from the wrong CDP project\n- 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.\n\n**Steps to resolve:**\n1. Add a valid payment method to your account using the [CDP Portal](https://portal.cdp.coinbase.com)\n2. Ensure your payment method is valid and not expired\n\n**Common causes:**\n- No payment method configured on the account\n- Payment method is expired","payment_required":"This error occurs when an x402 payment is required to access the requested resource.\n\n**Steps to resolve:**\n1. Include a valid x402 payment header in your request\n2. 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.\n\n**Steps to resolve:**\n1. Retry the request with a new payment\n2. Ensure the payment asset has sufficient balance for settlement","rate_limit_exceeded":"This error occurs when you've exceeded the API rate limits.\n\n**Steps to resolve:**\n1. Implement exponential backoff\n2. Cache responses where possible\n3. Wait for rate limit window to reset\n\n**Best practices:**\n```typescript lines wrap\nasync function withRetry(fn: () => Promise<any>) {\n  let delay = 1000;\n  while (true) {\n    try {\n      return await fn();\n    } catch (e) {\n      if (e.errorType === \"rate_limit_exceeded\") {\n        await sleep(delay);\n        delay *= 2;\n        continue;\n      }\n      throw e;\n    }\n  }\n}\n```","request_canceled":"This error occurs when the client cancels an in-progress request before it completes.\n\n**Steps to resolve:**\n1. Check client-side timeout configurations\n2. Review request cancellation logic in your code\n3. Consider increasing timeout thresholds for long-running operations\n4. Implement request tracking to identify premature cancellations\n\n**Best practices:**\n```typescript lines wrap\nasync function withTimeout<T>(promise: Promise<T>, timeoutMs: number): Promise<T> {\n  const timeout = new Promise((_, reject) => {\n    setTimeout(() => {\n      reject(new Error(\"Operation timed out\"));\n    }, timeoutMs);\n  });\n\n  try {\n    return await Promise.race([promise, timeout]);\n  } catch (error) {\n    // Handle timeout or cancellation\n    throw error;\n  }\n}\n```","service_unavailable":"This error occurs when the CDP API is temporarily unable to handle requests due to maintenance or high load.\n\n**Steps to resolve:**\n1. Retry your request after a short delay\n2. If persistent, contact CDP support with:\n   - The timestamp of the error\n   - Request details\n3. Consider implementing retry logic with an exponential backoff\n\n**Note:** These errors are automatically logged and monitored by CDP.","timed_out":"This error occurs when a request exceeds the maximum allowed processing time.\n\n**Steps to resolve:**\n1. Break down large requests into smaller chunks (if applicable)\n2. Implement retry logic with exponential backoff\n3. Use streaming endpoints for large data sets\n\n**Example retry implementation:**\n```typescript lines wrap\nasync function withRetryAndTimeout<T>(\n  operation: () => Promise<T>,\n  maxRetries = 3,\n  timeout = 30000,\n): Promise<T> {\n  let attempts = 0;\n  while (attempts < maxRetries) {\n    try {\n      return await Promise.race([\n        operation(),\n        new Promise((_, reject) =>\n          setTimeout(() => reject(new Error(\"Timeout\")), timeout)\n        ),\n      ]);\n    } catch (error) {\n      attempts++;\n      if (attempts === maxRetries) throw error;\n      // Exponential backoff\n      await new Promise(resolve =>\n        setTimeout(resolve, Math.pow(2, attempts) * 1000)\n      );\n    }\n  }\n  throw new Error(\"Max retries exceeded\");\n}\n```","unauthorized":"This error occurs when authentication fails.\n\n**Steps to resolve:**\n1. Verify your CDP API credentials:\n   - Check that your API key is valid\n   - Check that your Wallet Secret is properly configured\n2. Validate JWT token:\n   - Not expired\n   - Properly signed\n   - Contains required claims\n3. Check request headers:\n   - Authorization header present\n   - X-Wallet-Auth header included when required\n\n**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`.\n\n**Steps to resolve:**\n1. Read `Customer.requirements.tos.tosVersions[]` and find the entry whose `versionId` matches your acceptance.\n2. Choose a `language` from that entry's `languages` list (BCP 47 tags).\n3. 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.\n\n**Steps to resolve:**\n1. Update project or accounts to remove references to the Policy in question.\n2. 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.\n\n**Steps to resolve:**\n1. Verify the asset is tradable on the selected network\n2. Check the user's location to ensure it is allowed to purchase the asset on the selected network\n\n**Common causes:**\n- 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.\n\n**Steps to resolve:**\n1. 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.\n\n**Steps to resolve:**\n1. 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.\n\n**Steps to resolve:**\n1. 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.\n\n**Steps to resolve:**\n1. 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\nphone number to be verified every 60 days.\n\n**Steps to resolve:**\n1. Re-verify the user's phone number via OTP.\n2. 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.\n\n**Steps to resolve:**\n1. Ensure the `phoneNumber` or `email` field on the order matches the `destination` used during verification.\n2. 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.\nVerification IDs are valid for 60 days after successful OTP submission.\n\n**Steps to resolve:**\n1. Complete a new verification flow for the user.\n2. 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\n(the 10-minute OTP window has elapsed).\n\n**Steps to resolve:**\n1. Ask the user to re-enter the code.\n2. 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.\n\n**Common causes:**\n- The verification is still pending (OTP not yet submitted successfully).\n- The verification has been revoked.\n- The verification channel does not match the expected field (`smsVerificationId` or `emailVerificationId`).\n\n**Steps to resolve:**\n1. 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.\n\n**Steps to resolve:**\n1. Ensure you are passing the correct verification ID as `smsVerificationId` or `emailVerificationId`.\n2. 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.\n\n**Steps to resolve:**\n1. Verify the user's phone number and email before creating an order.\n2. 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.\n**Steps to resolve:**\n1. 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.\n**Steps to resolve:**\n1. Either disable the allowlist or add the wallet address at https://www.coinbase.com/settings/allowlist\n2. 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.\n**Steps to resolve:**\n1. 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.\n**Steps to resolve:**\n1. 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.\n\n**Steps to resolve:**\n1. Check if the user is already enrolled in the MFA method before initiating enrollment\n2. To update or reset MFA, remove the existing enrollment first (if supported)\n3. 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.\n\n**Steps to resolve:**\n1. Verify the user entered the correct code from their authenticator app\n2. Ensure the code is current (TOTP codes expire after 30 seconds)\n3. Check that the device time is synchronized correctly\n4. Ask the user to generate a new code and try again\n\n**Common causes:**\n- Typing errors in the 6-digit code\n- Using an expired TOTP code\n- Device clock drift on user's authenticator app\n- Attempting to reuse a previously submitted code","mfa_flow_expired":"This error occurs when the MFA enrollment or verification session has expired.\n\n**Steps to resolve:**\n1. Restart the MFA enrollment or verification flow\n2. Complete the flow within the allowed time window (typically 5 minutes)\n3. Ensure the user doesn't leave the flow idle for extended periods\n\n**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.\n\n**Steps to resolve:**\n1. Initiate the MFA verification flow using the `/mfa/verify/{mfaMethod}/init` endpoint\n2. Prompt the user to enter their MFA code\n3. Submit the verification using the `/mfa/verify/{mfaMethod}/submit` endpoint\n4. Use the returned access token with MFA claim for the sensitive operation\n5. Retry the original request with the new MFA-verified token\n\n**Operations requiring MFA:**\n- Transactions Sign/Send\n- Key export\n- 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.\n\n**Steps to resolve:**\n1. Check if the user has enrolled in MFA before attempting verification\n2. Guide the user through MFA enrollment first using the `/mfa/enroll/{mfaMethod}/init` endpoint\n3. 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.\n\n**Steps to resolve:**\n1. Verify the account ID format is correct (e.g., `account_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx`)\n2. Ensure the account ID belongs to your CDP entity\n3. Verify the account ID exists by calling `GET /v2/accounts/{accountId}` or `GET /v2/accounts`\n\n**Common causes:**\n- Malformed account ID\n- Typo in the account ID","target_account_invalid":"This error occurs when the target account specified in the transfer request is invalid or malformed.\n\n**Steps to resolve:**\n1. Verify the account ID format is correct (e.g., `account_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx`)\n2. Ensure the account exists and can receive funds\n3. Verify the account ID exists by calling `GET /v2/accounts/{accountId}` or `GET /v2/accounts`\n\n**Common causes:**\n- Malformed account ID\n- Typo in the account ID","source_account_not_found":"This error occurs when the source account specified in the transfer does not exist.\n\n**Steps to resolve:**\n1. 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.\n\n**Steps to resolve:**\n1. 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.\n\n**Steps to resolve:**\n1. Check the list of supported assets for the source account type\n2. Verify the asset symbol is correctly specified (e.g., `usdc`, `usdt`)\n\n**Common causes:**\n- Unsupported asset for the transfer route\n- 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.\n\n**Steps to resolve:**\n1. Check the list of supported assets for the target\n2. Verify the asset symbol is correctly specified (e.g., `usdc`, `usdt`)\n3. Ensure the target can receive this asset type\n\n**Common causes:**\n- Asset not supported by the target\n- Unsupported conversion between source and target assets","target_email_invalid":"This error occurs when the email address specified as the transfer target is invalid.\n\n**Steps to resolve:**\n1. Verify the email address format is valid (e.g., `user@example.com`)\n2. Check for typos in the email address\n3. Ensure the email domain is valid\n\n**Common causes:**\n- Invalid email format\n- Missing @ symbol or domain\n- 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.\n\n**Steps to resolve:**\n1. Ensure the network is supported for the transfer type\n2. Verify the address format matches the target network\n3. Ensure you haven't mixed up addresses from different networks\n\n**Common causes:**\n- Network not supported for the transfer type\n- Address format doesn't match network\n- Address from a different blockchain network","transfer_amount_invalid":"This error occurs when the transfer amount is invalid.\n\n**Steps to resolve:**\n1. Ensure the amount is a positive number and greater than $1 USD equivalent amount\n2. Verify the amount format is a valid decimal string (e.g., `\"100.50\"`)\n3. Check the number of decimal places for the asset\n\n**Common causes:**\n- Zero or negative amount\n- Too many decimal places for the asset\n- 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.\n\n**Steps to resolve:**\n1. Check the list of supported assets for transfers\n2. Verify the asset symbol is correctly specified\n3. Ensure the asset is supported for the transfer route (source → target)\n\n**Common causes:**\n- Asset not supported for transfers\n- Incorrect asset symbol","transfer_quote_expired":"This error occurs when the transfer quote has expired. Quotes are valid for a limited time.\n\n**Steps to resolve:**\n1. Create a new transfer to obtain a fresh quote\n2. Execute the transfer promptly after creation\n\n**Common causes:**\n- 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.\n\n**Steps to resolve:**\n1. Check the source account balance\n2. Ensure the balance covers both the transfer amount and any fees\n3. Consider using `amountType: \"source\"` to transfer the maximum available amount minus fees\n4. Add funds to the source account if needed\n\n**Common causes:**\n- Transfer amount exceeds available balance\n- Not accounting for transfer fees\n- Pending transactions reducing available balance","metadata_too_many_entries":"This error occurs when the transfer metadata contains more entries than allowed.\n\n**Steps to resolve:**\n1. Reduce the number of metadata entries (maximum 10 allowed)\n2. Consolidate related data into fewer keys\n3. Store additional data externally and reference it with a single metadata entry\n\n**Limits:**\n- Maximum entries: 10","metadata_key_too_long":"This error occurs when a metadata key exceeds the maximum allowed length.\n\n**Steps to resolve:**\n1. Shorten the metadata key to 40 characters or less\n2. Use abbreviations or shorter naming conventions\n3. Consider using a key-value structure where the value contains the longer identifier\n\n**Limits:**\n- Maximum key length: 40 characters","metadata_value_too_long":"This error occurs when a metadata value exceeds the maximum allowed length.\n\n**Steps to resolve:**\n1. Shorten the metadata value to 500 characters or less\n2. Store longer data externally and reference it with a shorter identifier\n3. Consider compressing or encoding the data if appropriate\n\n**Limits:**\n- Maximum value length: 500 characters","travel_rules_field_missing":"This error occurs when required travel rule fields are missing from the transfer request.\n\n**Steps to resolve:**\n1. Include the `travelRule` object in your transfer request\n2. Supply the required missing fields prompted by the error message\n3. Review the travel rule requirements for your jurisdiction\n\nNote: 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.\n\n**Steps to resolve:**\n1. Ensure the `asset` field matches either the source or target asset\n2. Verify that the source and target assets are compatible for conversion (if different)\n3. Check that the asset symbols are correctly specified\n\n**Common causes:**\n- Transfer asset doesn't match source or target\n- Attempting an unsupported asset conversion\n- Typo in asset symbols","order_quote_expired":"This error occurs when attempting to execute an order whose quote has expired.\n\n**Steps to resolve:**\n1. Create a new order with `execute: false` to get an updated quote.\n2. Execute the new order before the quote expires (check the `expiresAt` field).\n3. 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.\n\n**Steps to resolve:**\n1. Check the current status of the order using `GET /v2/orders/{orderId}`.\n2. 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.\n\n**Steps to resolve:**\n1. Check the current status of the order using `GET /v2/orders/{orderId}`.\n2. 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.\n\n**Steps to resolve:**\n1. Wait a few moments and retry the request\n2. 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.\n\n**Steps to resolve:**\n1. Try a smaller `fromAmount` — large orders may exceed available liquidity\n2. Try a different token pair\n3. 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`\non their behalf. ERC-20 swaps require a Permit2 allowance. Native ETH swaps do not.\n\n**Steps to resolve:**\n1. Submit an ERC-20 `approve` transaction on the `fromToken` contract, granting the Permit2\n   contract (`0x000000000022D473030F116dDEE9F6B43aC78BA3`) an allowance of at least `fromAmount`\n2. Wait for the approval transaction to be confirmed on-chain\n3. Retry the swap\n\n**Example:**\n```typescript lines wrap\n// Approve Permit2 to spend fromToken\nawait walletClient.writeContract({\n  address: fromToken,\n  abi: erc20Abi,\n  functionName: \"approve\",\n  args: [\"0x000000000022D473030F116dDEE9F6B43aC78BA3\", fromAmount],\n});\n```","transaction_simulation_failed":"This error occurs when the pre-broadcast simulation of the swap transaction predicted a revert.\nNo transaction was submitted and no gas was spent.\n\n**Common causes:**\n- The on-chain price moved past the `slippageBps` tolerance between the price estimate and execution\n- Taker balance changed between the price estimate and execution\n\n**Steps to resolve:**\n1. Retry immediately — prices change quickly and a new quote may succeed\n2. Increase `slippageBps` if retries continue to fail (e.g. from 100 to 200)\n3. 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\ndelegation grant exists for the end user (or account).\n\n**Steps to resolve:**\n1. Create a delegation grant using `createDelegationForEndUser` (user-scoped)\n   or `createDelegationForEndUserAccount` (account-scoped) before calling\n   the signing or sending operation\n2. If you previously created a grant, it may have expired or been revoked —\n   in those cases you would receive a `delegation_expired` or\n   `delegation_revoked` error instead\n3. For account-scoped grants, verify the address in the request matches the\n   granted address (EVM addresses are compared case-insensitively;\n   Solana addresses must match exactly)","delegation_expired":"This error occurs when the delegation grant used for signing has expired.\nDelegation grants have a limited lifetime set at creation.\n\n**Steps to resolve:**\n1. Create a new delegation grant using `createDelegationForEndUser` or\n   `createDelegationForEndUserAccount`\n2. Retry the signing operation with the new grant active\n3. Consider creating grants with a longer TTL if expiry is frequent","delegation_revoked":"This error occurs when the delegation grant has been explicitly revoked.\n\n**Steps to resolve:**\n1. Create a new delegation grant using `createDelegationForEndUser` or\n   `createDelegationForEndUserAccount`\n2. Confirm with the end user before recreating, since revocation is\n   typically intentional","delegation_not_authorized":"This error occurs when a delegation grant exists but does not authorize the\nrequested operation.\n\n**Steps to resolve:**\n1. For account-scoped grants, verify the signing address matches the address\n   the grant was created for\n2. Check that the operation is permitted for delegated signing on your project\n3. 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\nnot enabled the feature.\n\n**Steps to resolve:**\n1. Enable delegated signing in your project configuration via the CDP Portal\n2. Contact support if you believe delegated signing should already be enabled\n   for your project","network_mismatch":"This error occurs when the requested operation specifies a network on which the\ntarget resource is not deployed or not available.\n\n**Steps to resolve:**\n1. Use the network the resource was originally created or deployed on\n2. Check the resource metadata to confirm the correct network\n\n**Common causes:**\n- Specifying `base` for a resource that only exists on `base-sepolia` (or vice versa)\n- 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\nthe capability is already in the desired state.\n\n**Steps to resolve:**\n1. Check the current state of the resource before attempting the operation\n2. No action is needed if the resource is already in the desired state\n\n**Common causes:**\n- 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.\n\n**Steps to resolve:**\n1. 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.\n\n**Steps to resolve:**\n1. Check the payment session status — it is already authorized\n2. 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.\n\n**Steps to resolve:**\n1. Wait for the current action to complete before retrying\n2. 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.\n\n**Steps to resolve:**\n1. Verify the payment session status and previously captured amounts\n2. 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.\n\n**Steps to resolve:**\n1. Verify the payment session has an authorized but uncaptured balance\n2. 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.\n\n**Steps to resolve:**\n1. Verify the payment session has been previously captured\n2. 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.\n\n**Steps to resolve:**\n1. Contact support to enable payment acceptance for the entity","daily_transaction_limit_exceeded":"This error occurs when the daily transaction limit has been exceeded.\n\n**Steps to resolve:**\n1. Wait until the next day when the daily limit resets\n2. Contact support for questions about your limit","daily_amount_limit_exceeded":"This error occurs when the daily authorization amount limit has been exceeded.\n\n**Steps to resolve:**\n1. Wait until the next day when the daily limit resets\n2. Contact support for questions about your limit","stale_attestation":"The platform attestation (iOS App Attest assertion or Android Play Integrity token) was\ngenerated against a challenge that has since expired. The request was well-formed, but\nthe challenge is no longer valid.\n\n**Steps to resolve:**\n1. Call [Create Onramp Mobile Challenge](#operation/createOnrampMobileChallenge) to obtain\n   a fresh challenge.\n2. Re-run the platform attestation flow against the new challenge.\n3. Submit the new attestation to\n   [Create Onramp Mobile Session](#operation/createOnrampMobileSession) promptly —\n   challenges are short-lived.\n\n**Common causes:**\n- 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.\n\n**Steps to resolve:**\n1. 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\nthat determine what actions a customer can perform. Each capability must be\nexplicitly requested before use.\n","enum":["custodyCrypto","custodyFiat","custodyStablecoin","tradeCrypto","tradeStablecoin","transferCrypto","transferFiat","transferStablecoin"],"example":"custodyCrypto"},"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\nthis request. Present only when `errorType` is\n`customer_not_authorized`; absent for every other error type.\n\nUse this list to render onboarding UX for the listed capabilities, or\nfetch `GET /v2/customers/{customerId}` and inspect each entry's\n`status` / `requirements` to discover what (if anything) can be\nsubmitted to resolve the block.\n","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"}},"Compliance":{"type":"object","description":"Compliance context for a request. Carries per-request compliance signals,\nsuch as the IP address of the individual (i.e., end-customer) that\ninitiated the request.\n\nThis object is request-only — it is never echoed back in responses.\nInner fields are write-only.\n","properties":{"requesterIpAddress":{"type":"string","writeOnly":true,"description":"IPv4 or IPv6 address of the individual (i.e., end-customer) that\ninitiated this request. NOT the IP of the partner server making the\nAPI call.\n","example":"203.0.113.42"}},"example":{"requesterIpAddress":"203.0.113.42"}},"CreateAccountRequest":{"type":"object","properties":{"owner":{"allOf":[{"$ref":"#/components/schemas/Owner"}],"description":"The Owner of the Account to create.\n* If omitted, the account will be owned by the Entity making the request.\n* If the account is for a customer, the value will be a Customer ID,\n  e.g. `customer_af2937b0-9846-4fe7-bfe9-ccc22d935114`.\n\n* Further, the corresponding Customer must have all of the following capabilities enabled:\n  - `custodyCrypto`\n  - `custodyFiat`\n  - `custodyStablecoin`.","example":"customer_af2937b0-9846-4fe7-bfe9-ccc22d935114"},"name":{"$ref":"#/components/schemas/AccountName"},"compliance":{"$ref":"#/components/schemas/Compliance","writeOnly":true}}},"Asset":{"type":"string","minLength":1,"maxLength":42,"description":"The symbol of the asset (e.g., eth, usd, usdc, usdt).","example":"usd"},"AssetType":{"type":"string","description":"The type of the asset.","enum":["fiat","crypto"],"example":"crypto"},"balances_Asset":{"type":"object","description":"An asset, e.g. fiat or crypto.","properties":{"symbol":{"$ref":"#/components/schemas/Asset"},"type":{"$ref":"#/components/schemas/AssetType"},"name":{"type":"string","description":"The name of the asset."},"decimals":{"type":"integer","description":"The number of decimals (i.e. significant digits to the right of the decimal point) supported for the asset."}},"required":["symbol","type","name","decimals"],"example":{"symbol":"btc","type":"crypto","name":"Bitcoin","decimals":8}},"AmountDetail":{"type":"object","description":"Available and total amounts for a specific currency.","properties":{"available":{"type":"string","description":"The amount that is currently available to be used.","example":"2.5"},"total":{"type":"string","description":"The total amount, including the amount that is currently on hold.","example":"3.0"}},"required":["available","total"]},"Balance":{"type":"object","description":"A balance of an asset.","properties":{"asset":{"$ref":"#/components/schemas/balances_Asset"},"amount":{"type":"object","description":"Amount details denominated in different assets. \n- The keys represent the asset symbols (e.g., \"btc\", \"usd\"), - Each value contains available and total amounts. - There will always be an entry for the asset specified in the `asset` field.","additionalProperties":{"$ref":"#/components/schemas/AmountDetail"}}},"required":["asset","amount"],"example":{"asset":{"symbol":"btc","type":"crypto","name":"Bitcoin","decimals":8},"amount":{"btc":{"available":"2.5","total":"3.0"},"usd":{"available":"252705.4","total":"303246.48"}}}},"Balances":{"type":"object","description":"A list of balances for an account.","properties":{"balances":{"type":"array","description":"The list of balances.","items":{"$ref":"#/components/schemas/Balance"},"example":[{"asset":{"symbol":"btc","type":"crypto","name":"Bitcoin","decimals":8},"amount":{"btc":{"available":"2.5","total":"3.0"},"usd":{"available":"252705.4","total":"303246.48"}}}]}},"required":["balances"],"example":{"balances":[{"asset":{"symbol":"btc","type":"crypto","name":"Bitcoin","decimals":8},"amount":{"btc":{"available":"2.5","total":"3.0"},"usd":{"available":"252705.4","total":"303246.48"}}},{"asset":{"symbol":"usd","type":"fiat","name":"United States Dollar","decimals":2},"amount":{"usd":{"available":"90","total":"100"}}}]}},"CustomerId":{"type":"string","pattern":"^customer_[a-f0-9\\-]{36}$","description":"The ID of the Customer, which is a UUID prefixed by `customer_`.","example":"customer_af2937b0-9846-4fe7-bfe9-ccc22d935114"},"CustomerType":{"type":"string","description":"The type of the Customer.","enum":["individual"],"example":"individual"},"CapabilityStatus":{"type":"string","description":"The status of a capability. Based on recoverability:\n- `unrequested`: Capability has not been requested by the customer\n- `pending`: Customer can take action to resolve (requirements `due` or `rejected`)\n- `active`: Capability is enabled and can be used\n- `inactive`: Permanently blocked - no customer action possible\n","enum":["unrequested","pending","active","inactive"],"example":"active"},"Capability":{"type":"object","description":"The current state of a capability for a customer. The `status` field is always\npresent. When `requested` is `false`, the status will be `unrequested`.\n","properties":{"requested":{"type":"boolean","description":"Whether the customer has explicitly requested this capability.","example":true},"status":{"allOf":[{"$ref":"#/components/schemas/CapabilityStatus"}],"description":"Current status of the capability. When `requested` is `false`, status is `unrequested`.\nWhen `requested` is `true`, status is one of `pending`, `active`, or `inactive`.\n","example":"active"}},"required":["requested","status"]},"CapabilitiesMap":{"type":"object","description":"The current state of each capability for a Customer. Each capability shows\nwhether it has been requested and its current status.\n","properties":{"custodyCrypto":{"allOf":[{"$ref":"#/components/schemas/Capability"}],"description":"Hold cryptocurrency in a Coinbase custodial account."},"custodyFiat":{"allOf":[{"$ref":"#/components/schemas/Capability"}],"description":"Hold fiat currency in a Coinbase custodial account."},"custodyStablecoin":{"allOf":[{"$ref":"#/components/schemas/Capability"}],"description":"Hold stablecoin in a Coinbase custodial account."},"tradeCrypto":{"allOf":[{"$ref":"#/components/schemas/Capability"}],"description":"Trade cryptocurrency."},"tradeStablecoin":{"allOf":[{"$ref":"#/components/schemas/Capability"}],"description":"Trade stablecoin."},"transferCrypto":{"allOf":[{"$ref":"#/components/schemas/Capability"}],"description":"Transfer cryptocurrency to another party."},"transferFiat":{"allOf":[{"$ref":"#/components/schemas/Capability"}],"description":"Transfer fiat currency to another party."},"transferStablecoin":{"allOf":[{"$ref":"#/components/schemas/Capability"}],"description":"Transfer stablecoin to another party."}},"example":{"custodyCrypto":{"requested":true,"status":"active"},"custodyFiat":{"requested":false,"status":"unrequested"},"custodyStablecoin":{"requested":false,"status":"unrequested"},"tradeCrypto":{"requested":false,"status":"unrequested"},"tradeStablecoin":{"requested":false,"status":"unrequested"},"transferCrypto":{"requested":true,"status":"active"},"transferFiat":{"requested":false,"status":"unrequested"},"transferStablecoin":{"requested":false,"status":"unrequested"}}},"RequirementStatus":{"type":"string","description":"The current status of a requirement:\n- `due`: Must be submitted\n- `pending`: Submitted, awaiting verification\n- `rejected`: Verification failed - customer must resubmit\n\nWhen verification passes, the requirement disappears from the response entirely.\n","enum":["due","pending","rejected"],"example":"due"},"TosVersionId":{"type":"string","minLength":1,"maxLength":64,"description":"Stable, opaque identifier for a specific Terms of Service version\n(for example, `us_individual_2026-05-29`). The same identifier is\nsurfaced on `Customer.requirements.tos.tosVersions[].versionId` (the\nversions a Customer still needs to accept) and on\n`Customer.tosAcceptances[].versionId` (the versions the Customer has\naccepted). Treat the value as opaque and submit it verbatim; the\nidentifier format is stable across API versions, but the set of\nvalid values grows over time as new Terms of Service versions are\npublished.\n","example":"us_individual_2026-05-29"},"TermsOfService":{"type":"object","description":"Metadata for one Terms of Service document a Customer may need to\naccept. Each entry represents one logical document (identified by\n`versionId`) that may be published in multiple languages —\n`languages` lists the BCP 47 language tags the document is available\nto view and accept in. `url` is the canonical, language-agnostic\ndocument URL; partners append `?lang=<tag>` (where `<tag>` is one of\n`languages`) to retrieve a specific translation, and omit the\nparameter to let the documentation site choose a default. This API\ndoes not serve Terms of Service body content; this schema describes\nmetadata only.\n","properties":{"versionId":{"allOf":[{"$ref":"#/components/schemas/TosVersionId"}],"description":"Stable identifier for this Terms of Service document. Submit this\nvalue as `versionId` on a `TosAcceptance` to record acceptance.\n"},"languages":{"type":"array","description":"BCP 47 language tags this Terms of Service document can be viewed\nand accepted in. The list is non-empty (every published document\ncarries at least one language). Append the chosen tag to `url` as\n`?lang=<tag>` to fetch the localized document, and submit the same\ntag as `language` on the corresponding `TosAcceptance` to record\nwhich translation the Customer reviewed.\n","minItems":1,"items":{"type":"string","example":"en"},"example":["en"]},"url":{"allOf":[{"$ref":"#/components/schemas/Url"}],"description":"Canonical, language-agnostic URL where the Terms of Service\ndocument is hosted (for example,\n`https://docs.cdp.coinbase.com/legal/terms/us_individual_2026-05-29`).\nAppend `?lang=<tag>` (where `<tag>` is one of `languages`) to\nretrieve a specific translation; without the parameter, the\ndocumentation site renders a default translation.\n","example":"https://docs.cdp.coinbase.com/legal/terms/us_individual_2026-05-29"}},"required":["versionId","languages","url"],"example":{"versionId":"us_individual_2026-05-29","languages":["en"],"url":"https://docs.cdp.coinbase.com/legal/terms/us_individual_2026-05-29"}},"TaxForm":{"type":"string","description":"Identifier for a tax attestation form a Customer may need to\ncomplete. The same identifier is surfaced on\n`Customer.requirements.taxAttestation.taxForms[]` (the forms a\nCustomer still needs to attest to) and submitted back as `form` on\n`Customer.taxAttestations[]` to record the attestation.\n","enum":["us_w9"],"example":"us_w9"},"Requirement":{"type":"object","description":"A single requirement that a customer must submit to enable capabilities.\nRequirements are only shown for requested capabilities.\n","properties":{"status":{"$ref":"#/components/schemas/RequirementStatus"},"deadline":{"type":"string","format":"date-time","description":"Optional deadline by which this requirement must be satisfied.\n\nFor the `tos` and `taxAttestation` requirements, when present, `deadline`\nis the earliest among the unaccepted required Terms of Service versions\nlisted in `tosVersions`.\n"},"impact":{"type":"array","description":"List of capabilities affected by this requirement, sorted alphabetically.\nOnly present for `due`, `pending`, or `rejected` statuses.\n","items":{"$ref":"#/components/schemas/CapabilityName"},"example":["custodyCrypto","transferCrypto"]},"tosVersions":{"type":"array","description":"Required Terms of Service versions the Customer has not yet\naccepted, with the metadata needed to render an acceptance UI\n(each entry carries a stable `versionId`, the BCP 47\n`languages` the version is published in, and a\nlanguage-agnostic `url`). This field appears only under the\nrequirement key `tos`; do not infer meaning from `tosVersions`\non other requirement keys. Only populated for the `tos`\nrequirement; omitted on every other requirement key. Submit each\n`versionId` back via `tosAcceptances[].versionId` on `Update Customer` (or\n`Create Customer`) together with `language` and `acceptedAt` to clear the requirement.\n","items":{"$ref":"#/components/schemas/TermsOfService"},"example":[{"versionId":"us_individual_2026-05-29","languages":["en"],"url":"https://docs.cdp.coinbase.com/legal/terms/us_individual_2026-05-29"}]},"taxForms":{"type":"array","description":"Required tax attestation forms the Customer has not yet completed.\nThis field appears only under the requirement key `taxAttestation`.\nSubmit each `form` back via `taxAttestations[].form` on\n`Update Customer` (or `Create Customer`) together with the other\nfields required for that form to clear the requirement.\n","items":{"$ref":"#/components/schemas/TaxForm"},"example":["us_w9"]}},"required":["status"],"example":{"status":"due","impact":["custodyCrypto","transferCrypto"]}},"RequirementsMap":{"type":"object","description":"Map of requirements to be submitted. Each key is the field name\n(e.g., \"ssnLast4\"), with values to describe its state. Requirements\nare only shown for requested capabilities. When a requirement is\nverified, it disappears from this map.\n\nWhen comparing deadlines across keys, note that `requirements.tos.deadline`\nis an aggregate: the earliest deadline among unaccepted required Terms of\nService versions listed in `requirements.tos.tosVersions[]` (not a separate\nclock from those version rows).\n","additionalProperties":{"$ref":"#/components/schemas/Requirement"},"example":{"firstName":{"status":"due","impact":["custodyCrypto","transferCrypto"]},"fullSsn":{"status":"rejected","impact":["custodyCrypto"]},"ssnLast4":{"status":"pending","impact":["custodyCrypto"]},"sourceOfFunds":{"status":"due"},"citizenship":{"status":"due"},"tos":{"status":"due","impact":["transferFiat"],"tosVersions":[{"versionId":"us_individual_2026-05-29","languages":["en"],"url":"https://docs.cdp.coinbase.com/legal/terms/us_individual_2026-05-29"}]},"taxAttestation":{"status":"due","impact":["transferFiat"],"taxForms":["us_w9"]}}},"Email":{"type":"string","format":"email","maxLength":254,"pattern":"^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}/-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$","description":"An email address. Maximum length 254 characters per [RFC 5321](https://www.rfc-editor.org/rfc/rfc5321).","example":"user@example.com"},"Individual":{"type":"object","description":"Individual customer data returned on read — the `individual` object on\nGet / Create / Update Customer responses. Only contact-identity fields are\nechoed back; every other field accepted on the `IndividualInput` object\n(`address`, `ssnLast4`, `dateOfBirth`, `fullSsn`, `citizenship`,\n`phoneNumber`, and the CDD fields) is ingestion-only and never returned.\n","properties":{"firstName":{"type":"string","description":"First name (given name).","example":"Jane"},"lastName":{"type":"string","description":"Last name (family name/surname).","example":"Doe"},"email":{"allOf":[{"$ref":"#/components/schemas/Email"}],"description":"Email address for the customer.","example":"jane.doe@example.com"}},"example":{"firstName":"Jane","lastName":"Doe","email":"jane.doe@example.com"}},"ProjectId":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$","description":"The ID of the Project, a UUID v4.","example":"af2937b0-9846-4fe7-bfe9-ccc22d935114"},"TosAcceptance":{"type":"object","description":"A single Terms of Service acceptance recorded for a Customer. Submit\none entry per required document listed in\n`Customer.requirements.tos.tosVersions[]` (returned on `Get Customer`,\n`Create Customer`, and `Update Customer`). `language` records the\nsingle translation the Customer actually reviewed.\n\nWhen new required Terms of Service versions are published, only the\nnew `versionId`s appear in `Customer.requirements.tos.tosVersions[]`;\nsubmit acceptances for only those new version(s).\n","additionalProperties":false,"properties":{"versionId":{"allOf":[{"$ref":"#/components/schemas/TosVersionId"}],"description":"The `versionId` of the Terms of Service document being accepted,\nas listed in `Customer.requirements.tos.tosVersions[]`.\n"},"language":{"type":"string","description":"BCP 47 language tag of the Terms of Service translation the\nCustomer reviewed. At write time the server rejects values that\nare not listed under `languages` on the matching required\ndocument for this Customer (same `versionId` as listed in\n`Customer.requirements.tos.tosVersions[]`).\n","example":"en"},"acceptedAt":{"type":"string","format":"date-time","description":"Timestamp at which the Customer accepted the Terms of Service,\nin ISO 8601 / RFC 3339 format. The server may validate or reject\nobviously non-credible timestamps; when enforcement tightens,\nthe authoritative acceptance time may be recorded server-side\ninstead of trusting client-supplied values alone.\n","example":"2026-04-10T12:00:00Z"}},"required":["versionId","language","acceptedAt"],"example":{"versionId":"us_individual_2026-05-29","language":"en","acceptedAt":"2026-04-10T12:00:00Z"}},"Customer":{"type":"object","description":"A customer record returned on read (Get / Create / Update Customer).","properties":{"customerId":{"$ref":"#/components/schemas/CustomerId"},"type":{"$ref":"#/components/schemas/CustomerType"},"capabilities":{"allOf":[{"$ref":"#/components/schemas/CapabilitiesMap"}],"description":"Current state of each capability for this customer. Each capability\nshows whether it has been requested and its current status.\n","readOnly":true,"example":{}},"requirements":{"allOf":[{"$ref":"#/components/schemas/RequirementsMap"}],"description":"Map of requirements to be submitted. Each key is the field name, with\nvalues to describe its state. Requirements are only shown for requested\ncapabilities. When a requirement is fulfilled, it disappears from this map.\n","readOnly":true,"example":{}},"createdAt":{"type":"string","format":"date-time","description":"Timestamp when the customer was created.","example":"2026-01-10T14:25:00Z","readOnly":true},"updatedAt":{"type":"string","format":"date-time","description":"Timestamp when the customer was last updated.","example":"2026-01-10T14:30:00Z","readOnly":true},"individual":{"$ref":"#/components/schemas/Individual"},"projectIds":{"type":"array","description":"The project IDs that this customer is associated with.","items":{"$ref":"#/components/schemas/ProjectId"},"example":[]},"tosAcceptances":{"type":"array","description":"Terms of Service acceptances recorded for the customer.\n","items":{"$ref":"#/components/schemas/TosAcceptance"},"example":[{"versionId":"us_individual_2026-05-29","language":"en","acceptedAt":"2026-04-10T12:00:00Z"}]}},"required":["customerId","type","capabilities","requirements"]},"CapabilityInput":{"type":"object","description":"Request to enable or disable a capability.","additionalProperties":false,"properties":{"requested":{"type":"boolean","description":"Whether to request this capability.","example":true}},"required":["requested"]},"CapabilitiesMapInput":{"type":"object","description":"The capabilities to request for a Customer. Each capability can be\nindividually requested. The requirements to enable each capability\nwill be returned in the response.\n","additionalProperties":false,"properties":{"custodyCrypto":{"allOf":[{"$ref":"#/components/schemas/CapabilityInput"}],"description":"Hold cryptocurrency in a Coinbase custodial account."},"custodyFiat":{"allOf":[{"$ref":"#/components/schemas/CapabilityInput"}],"description":"Hold fiat currency in a Coinbase custodial account."},"custodyStablecoin":{"allOf":[{"$ref":"#/components/schemas/CapabilityInput"}],"description":"Hold stablecoin in a Coinbase custodial account."},"tradeCrypto":{"allOf":[{"$ref":"#/components/schemas/CapabilityInput"}],"description":"Trade cryptocurrency."},"tradeStablecoin":{"allOf":[{"$ref":"#/components/schemas/CapabilityInput"}],"description":"Trade stablecoin."},"transferCrypto":{"allOf":[{"$ref":"#/components/schemas/CapabilityInput"}],"description":"Transfer cryptocurrency to another party."},"transferFiat":{"allOf":[{"$ref":"#/components/schemas/CapabilityInput"}],"description":"Transfer fiat currency to another party."},"transferStablecoin":{"allOf":[{"$ref":"#/components/schemas/CapabilityInput"}],"description":"Transfer stablecoin to another party."}},"example":{"custodyCrypto":{"requested":true},"transferCrypto":{"requested":true}}},"PhysicalAddress":{"type":"object","description":"A physical address with standard address components including street, city, state/province, postal code, and country.","properties":{"line1":{"type":"string","description":"Primary street address.","example":"123 Market St"},"line2":{"type":"string","description":"Secondary address information.","example":"Suite 400"},"city":{"type":"string","description":"City or locality.","example":"San Francisco"},"state":{"type":"string","description":"State, province, or region.","example":"CA"},"postCode":{"type":"string","description":"Postal or ZIP code.","example":"94105"},"countryCode":{"type":"string","minLength":2,"maxLength":2,"description":"ISO 3166-1 alpha-2 country code (2 characters). See https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes.","example":"US"}}},"DateOfBirthLenient":{"type":"object","description":"Date of birth with lenient formatting. Accepts both zero-padded (\"04\", \"07\")\nand single-digit (\"4\", \"7\") values for day and month.\n","additionalProperties":false,"properties":{"day":{"type":"string","description":"Day of birth (1-31). Both single-digit (\"7\") and zero-padded (\"07\") formats are accepted.","minLength":1,"maxLength":2,"pattern":"^(?:0?[1-9]|[12][0-9]|3[01])$","example":"15"},"month":{"type":"string","description":"Month of birth (1-12). Both single-digit (\"4\") and zero-padded (\"04\") formats are accepted.","minLength":1,"maxLength":2,"pattern":"^(?:0?[1-9]|1[0-2])$","example":"08"},"year":{"type":"string","description":"Year of birth (four digits).","minLength":4,"maxLength":4,"pattern":"^[0-9]{4}$","example":"1990"}},"example":{"day":"15","month":"08","year":"1990"}},"PhoneNumber":{"type":"string","pattern":"^\\+[1-9]\\d{1,14}$","description":"A phone number in [E.164](https://en.wikipedia.org/wiki/E.164) format.","example":"+12055555555"},"IndividualInput":{"type":"object","description":"Individual customer data submitted on create / update requests. Fields are\norganized by the capabilities they unlock; not all are required for all\ncustomers (the requirements depend on which capabilities are requested).\nRead responses return the narrower `Individual` object (only `firstName`,\n`lastName`, and `email`), not this full request shape.\n","additionalProperties":false,"properties":{"firstName":{"type":"string","description":"First name (given name).","example":"Jane"},"lastName":{"type":"string","description":"Last name (family name/surname).","example":"Doe"},"address":{"allOf":[{"$ref":"#/components/schemas/PhysicalAddress"},{"type":"object","properties":{"countryCode":{"description":"ISO 3166-1 alpha-2 country code. Only US addresses\nare currently supported.\n","enum":["US"]}}}],"description":"Primary residential address. Only US addresses are currently\nsupported. Non-US `countryCode` values are rejected with a 400.\n"},"ssnLast4":{"type":"string","description":"Last 4 digits of the Social Security Number (US only).\nUsed for identity verification.\n","minLength":4,"maxLength":4,"pattern":"^[0-9]{4}$","example":"6789"},"dateOfBirth":{"allOf":[{"$ref":"#/components/schemas/DateOfBirthLenient"}],"description":"Date of birth."},"fullSsn":{"type":"string","description":"Full Social Security Number (US only).\n","pattern":"^([0-9]{3}-[0-9]{2}-[0-9]{4}|\\*\\*\\*-\\*\\*-[0-9]{4})$","example":"***-**-6789"},"citizenship":{"type":"string","description":"ISO 3166-1 alpha-2 country code representing the customer's\ncitizenship. Only US is currently supported. Non-US values\nare rejected with a 400.\n","minLength":2,"maxLength":2,"pattern":"^[A-Z]{2}$","enum":["US"],"example":"US"},"email":{"allOf":[{"$ref":"#/components/schemas/Email"}],"description":"Email address for the customer.","example":"jane.doe@example.com"},"phoneNumber":{"allOf":[{"$ref":"#/components/schemas/PhoneNumber"}],"description":"Phone number in [E.164](https://en.wikipedia.org/wiki/E.164) format.","example":"+15551234567"},"purposeOfAccount":{"type":"string","description":"Primary purpose for using Coinbase services.\n","enum":["investing","long_term_investment","short_term_investment","trading","trading_on_coinbase","trading_on_other_exchanges","day_trading","arbitrage_trading","online_purchases","online_payments","payments_or_gifts","payments_to_friends","transfer_crypto","investing_on_other_exchanges","business","other"],"example":"investing"},"sourceOfFunds":{"type":"string","description":"Primary source of funds for the account.\n","enum":["salary","employment_business_income","investments","savings","pension","business_earnings","crypto_assets","inheritance","sale_of_assets","sale_of_company_shares_or_dividends","sale_of_property","sale_of_other_assets","credit_or_loan","government_benefits_or_credits","legal_settlement","family_or_third_party","lottery_or_gambling","crypto_mining","other"],"example":"salary"},"employmentStatus":{"type":"string","description":"Current employment status.\n","enum":["employed_fulltime","employed_parttime","self_employed","employed_government_official","employed_company_officer_or_board_member","employed_crypto_related_business","personal_trader_or_angel_investor","crypto_miner","student","retired","homemaker","unemployed","dependent"],"example":"employed_fulltime"},"occupation":{"type":"string","description":"Industry or occupation.\n","enum":["agriculture","arts_and_media","casinos_and_gaming","construction","cryptocurrency","defense","education","energy_oil_and_gas","energy_other","entertainment","finance","financial_services_non_crypto","fintech_non_crypto_software_development","fintech_non_crypto_internet_only_financial_institution","fintech_non_crypto_other","food_and_hospitality","government","health_and_fitness","healthcare","healthcare_other","healthcare_pharmaceuticals","mining","mining_crypto","non_profit_and_charity","pharma_industry","politics","professional_services","property_and_construction_building_work","property_and_construction_commercial_and_management","property_and_construction_design","real_estate","retail_fashion","retail_food_and_beverage","retail_jewelry_and_antiques","retail_other","retail_pharmacy","technology","technology_and_it","transportation","all_other_industries_and_services","dependent_student_unemployed","other"],"example":"technology"},"expectedVolume":{"type":"string","description":"Expected annual volume of activity on the account, expressed as a\ndollar range. Use the dollar-honest ids below:\n\n- `under_1k`: $0 – $1,000\n- `1k_to_10k`: $1,000 – $10,000\n- `10k_to_100k`: $10,000 – $100,000\n- `100k_to_250k`: $100,000 – $250,000\n- `250k_to_750k`: $250,000 – $750,000\n- `750k_to_1_5m`: $750,000 – $1.5M\n- `1_5m_plus`: $1.5M+\n","enum":["under_1k","1k_to_10k","10k_to_100k","100k_to_250k","250k_to_750k","750k_to_1_5m","1_5m_plus"],"example":"under_1k"}},"example":{"firstName":"Jane","lastName":"Doe","address":{"line1":"500 Main St","city":"Boston","state":"MA","postCode":"02108","countryCode":"US"},"ssnLast4":"6789","dateOfBirth":{"day":"15","month":"08","year":"1990"},"email":"jane.doe@example.com","phoneNumber":"+15551234567"}},"UsW9Attestation":{"type":"object","title":"IRS Form W-9","description":"Tax attestation for IRS Form W-9, used for US persons. Carries the\nW-9-specific backup withholding certification alongside the fields common\nto every form (`edeliveryConsent`, `acceptedAt`).\n","additionalProperties":false,"properties":{"form":{"type":"string","description":"The tax form being attested to, as listed in\n`Customer.requirements.taxAttestation.taxForms[]`. Must be `us_w9`\nfor this variant.\n","enum":["us_w9"],"example":"us_w9"},"edeliveryConsent":{"type":"boolean","description":"Whether the Customer consents to electronic delivery (e-delivery) of\ntax documents. Both `true` and `false` are recorded as submitted.\n","example":true},"acceptedAt":{"type":"string","format":"date-time","description":"Timestamp at which the Customer completed the tax attestation, in\nISO 8601 / RFC 3339 format. The server may reject obviously\nnon-credible timestamps.\n","example":"2026-04-17T20:00:00Z"},"isExemptBackupWithholding":{"type":"boolean","description":"Whether the Customer is exempt from backup withholding, as certified\non IRS Form W-9.\n","example":true}},"required":["form","edeliveryConsent","acceptedAt","isExemptBackupWithholding"],"example":{"form":"us_w9","isExemptBackupWithholding":true,"edeliveryConsent":true,"acceptedAt":"2026-04-17T20:00:00Z"}},"TaxAttestation":{"description":"A single tax attestation recorded for a Customer. Submit one entry per\nrequired form listed in `Customer.requirements.taxAttestation.taxForms[]`\n(returned on `Get Customer`, `Create Customer`, and `Update Customer`\nwhenever a `taxAttestation` requirement is unsatisfied). The `form` field\nselects the variant and determines which additional fields are required.\n","oneOf":[{"$ref":"#/components/schemas/UsW9Attestation"}],"discriminator":{"propertyName":"form","mapping":{"us_w9":"#/components/schemas/UsW9Attestation"}}},"CustomerWriteBase":{"type":"object","description":"Fields accepted on customer create and update requests. Shared by\n`CreateCustomerRequest` and `UpdateCustomerRequest`; excludes the\nserver-managed response-only fields that appear on `Customer`.\n","additionalProperties":false,"properties":{"type":{"allOf":[{"$ref":"#/components/schemas/CustomerType"}],"description":"The type of the customer. Required on create; accepted but ignored on\nupdate.\n","example":"individual"},"capabilities":{"allOf":[{"$ref":"#/components/schemas/CapabilitiesMapInput"}],"description":"Capabilities to request for the customer.","example":{}},"individual":{"allOf":[{"$ref":"#/components/schemas/IndividualInput"}],"description":"Information about an Individual customer. Not all fields are required\nfor all customers; the requirements depend on which capabilities are\nrequested. Submit only fields that are required by the capabilities\nthat have been requested.\n","example":{"firstName":"Jane","lastName":"Doe"}},"projectIds":{"type":"array","description":"The project IDs that this customer is associated with.","items":{"$ref":"#/components/schemas/ProjectId"},"example":[]},"tosAcceptances":{"type":"array","description":"Terms of Service acceptances to record on the customer. Submit one\nentry per required version surfaced inline on\n`requirements.tos.tosVersions[]` (returned by `Get Customer`,\n`Create Customer`, and `Update Customer` whenever a `tos` requirement\nis unsatisfied). The server rejects each acceptance whose `language`\nis not listed under `languages` on the matching required version with\n`errorType: \"unsupported_tos_language\"`.\n\nWhen new required Terms of Service versions are published, only the\nnew `versionId`s appear in `requirements.tos.tosVersions[]`; submit\nacceptances for only those new version(s).\n\nOmit `tosAcceptances` on a partial update to leave previously recorded\nacceptances unchanged. Sending `tosAcceptances: []` is invalid\n(`errorType: \"invalid_request\"`) because it would clear all acceptances\nwithout replacing them; omit the field entirely when you are not\nupdating Terms of Service acceptances.\n","items":{"$ref":"#/components/schemas/TosAcceptance"},"example":[{"versionId":"us_individual_2026-05-29","language":"en","acceptedAt":"2026-04-10T12:00:00Z"}]},"taxAttestations":{"type":"array","writeOnly":true,"description":"Tax attestations to record on the customer. Submit one entry per\nrequired form surfaced inline on\n`requirements.taxAttestation.taxForms[]` (returned by `Get Customer`,\n`Create Customer`, and `Update Customer` whenever a `taxAttestation`\nrequirement is unsatisfied). The required fields per entry depend on\n`form`; see `TaxAttestation`. This field is ingestion-only and is\nnever returned on read.\n\nOmit `taxAttestations` on a partial update to leave previously\nrecorded attestations unchanged. Sending `taxAttestations: []` is\ninvalid (`errorType: \"invalid_request\"`) because it would clear all\nattestations without replacing them; omit the field entirely when you\nare not updating tax attestations.\n","items":{"$ref":"#/components/schemas/TaxAttestation"},"example":[{"form":"us_w9","isExemptBackupWithholding":true,"edeliveryConsent":true,"acceptedAt":"2026-04-17T20:00:00Z"}]},"compliance":{"$ref":"#/components/schemas/Compliance","writeOnly":true}}},"CreateCustomerRequest":{"allOf":[{"$ref":"#/components/schemas/CustomerWriteBase"},{"type":"object","required":["type"]}]},"UpdateCustomerRequest":{"allOf":[{"$ref":"#/components/schemas/CustomerWriteBase"}]},"DepositDestinationType":{"type":"string","description":"The type of deposit destination.","oneOf":[{"title":"Crypto","enum":["crypto"]}],"example":"crypto"},"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"},"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"},"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"},"DepositDestinationCrypto":{"type":"object","description":"Crypto-specific deposit destination details. In responses, this object is always present. Contains the network and address for the deposit destination.","properties":{"network":{"$ref":"#/components/schemas/Network"},"address":{"$ref":"#/components/schemas/BlockchainAddress"}},"required":["network","address"],"example":{"network":"base","address":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"}},"DepositDestinationTargetAccount":{"type":"object","title":"Target Account","description":"The account and asset where incoming deposits should be credited.","additionalProperties":false,"properties":{"accountId":{"allOf":[{"$ref":"#/components/schemas/AccountId"}],"description":"The ID of the CDP Account to which deposited funds should be transferred."},"asset":{"allOf":[{"$ref":"#/components/schemas/Asset"}],"description":"The symbol of the asset that should land in the target account.","example":"usd"}},"required":["asset"],"example":{"accountId":"account_af2937b0-9846-4fe7-bfe9-ccc22d935114","asset":"usd"}},"DepositDestinationTarget":{"description":"The intended target for deposited funds.","oneOf":[{"$ref":"#/components/schemas/DepositDestinationTargetAccount"}]},"DepositDestinationStatus":{"type":"string","description":"The status of the deposit destination.","enum":["active","inactive","pending"],"example":"active"},"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"}},"CryptoDepositDestination":{"title":"Crypto","type":"object","description":"A cryptocurrency deposit destination.","properties":{"depositDestinationId":{"$ref":"#/components/schemas/DepositDestinationId"},"accountId":{"$ref":"#/components/schemas/AccountId"},"type":{"type":"string","description":"The type of deposit destination.","enum":["crypto"],"example":"crypto"},"crypto":{"allOf":[{"$ref":"#/components/schemas/DepositDestinationCrypto"}],"description":"Crypto-specific details for this deposit destination. Always populated in responses. Contains the network and address."},"target":{"$ref":"#/components/schemas/DepositDestinationTarget"},"status":{"$ref":"#/components/schemas/DepositDestinationStatus"},"metadata":{"$ref":"#/components/schemas/Metadata"},"createdAt":{"type":"string","format":"date-time","description":"The timestamp when the deposit destination was created.","example":"2023-10-08T14:30:00Z"},"updatedAt":{"type":"string","format":"date-time","description":"The timestamp when the deposit destination was last updated.","example":"2023-10-08T14:30:00Z"}},"required":["depositDestinationId","accountId","type","crypto","status","createdAt","updatedAt"],"example":{"depositDestinationId":"depositDestination_af2937b0-9846-4fe7-bfe9-ccc22d935114","accountId":"account_af2937b0-9846-4fe7-bfe9-ccc22d935114","type":"crypto","crypto":{"network":"base","address":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"},"target":{"accountId":"account_bf3847c1-a957-5ae8-cfa0-ddd33e046225","asset":"usd"},"status":"active","metadata":{"customer_id":"123e4567-e89b-12d3-a456-426614174000","reference":"order-12345"},"createdAt":"2023-10-08T14:30:00Z","updatedAt":"2023-10-08T14:30:00Z"}},"DepositDestination":{"description":"A deposit destination for receiving funds to an account.","oneOf":[{"$ref":"#/components/schemas/CryptoDepositDestination"}],"discriminator":{"propertyName":"type","mapping":{"crypto":"#/components/schemas/CryptoDepositDestination"}}},"CreateDepositDestinationRequestBase":{"type":"object","description":"Common fields for creating a deposit destination.","properties":{"accountId":{"description":"The ID of the Account, which is a UUID prefixed by the string `account_`, that owns the deposit destination.","$ref":"#/components/schemas/AccountId"},"type":{"$ref":"#/components/schemas/DepositDestinationType"},"target":{"$ref":"#/components/schemas/DepositDestinationTarget"},"metadata":{"$ref":"#/components/schemas/Metadata"},"compliance":{"$ref":"#/components/schemas/Compliance","writeOnly":true}},"required":["accountId","type"],"example":{"accountId":"account_af2937b0-9846-4fe7-bfe9-ccc22d935114","type":"crypto","target":{"accountId":"account_af2937b0-9846-4fe7-bfe9-ccc22d935114","asset":"usd"}}},"CreateDepositDestinationCrypto":{"type":"object","description":"Crypto-specific details for creating a deposit destination.","properties":{"network":{"$ref":"#/components/schemas/Network"}},"required":["network"],"example":{"network":"base"}},"CreateCryptoDepositDestinationRequest":{"title":"Crypto","allOf":[{"$ref":"#/components/schemas/CreateDepositDestinationRequestBase"},{"type":"object","properties":{"type":{"type":"string","enum":["crypto"]},"crypto":{"allOf":[{"$ref":"#/components/schemas/CreateDepositDestinationCrypto"}],"description":"Crypto-specific details. Required when `type` is `crypto`."}},"required":["crypto"]}],"example":{"accountId":"account_af2937b0-9846-4fe7-bfe9-ccc22d935114","type":"crypto","crypto":{"network":"base"},"target":{"accountId":"account_af2937b0-9846-4fe7-bfe9-ccc22d935114","asset":"usd"},"metadata":{"customer_id":"123e4567-e89b-12d3-a456-426614174000","reference":"order-12345"}}},"CreateDepositDestinationRequest":{"description":"Request to create a new deposit destination. Provide the type-specific details matching the chosen `type`.","discriminator":{"propertyName":"type","mapping":{"crypto":"#/components/schemas/CreateCryptoDepositDestinationRequest"}},"oneOf":[{"$ref":"#/components/schemas/CreateCryptoDepositDestinationRequest"}]},"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."]},"transfers_Account":{"type":"object","title":"Account","description":"The Account specific details for the transfer.","properties":{"accountId":{"allOf":[{"$ref":"#/components/schemas/AccountId"}],"description":"The ID of the Account."},"asset":{"$ref":"#/components/schemas/Asset"}},"required":["accountId","asset"],"example":{"accountId":"account_af2937b0-9846-4fe7-bfe9-ccc22d935114","asset":"usd"}},"PaymentMethodId":{"type":"string","pattern":"^paymentMethod_[a-f0-9\\-]{36}$","description":"The ID of the Payment Method, which is a UUID prefixed by the string `paymentMethod_`.","example":"paymentMethod_8e03978e-40d5-43e8-bc93-6894a57f9324"},"PaymentMethod":{"type":"object","title":"Payment Method","description":"The Payment Method specific details for the transfer.","properties":{"paymentMethodId":{"allOf":[{"$ref":"#/components/schemas/PaymentMethodId"}],"description":"The ID of the Payment Method.","example":"paymentMethod_af2937b0-9846-4fe7-bfe9-ccc22d935114"},"asset":{"$ref":"#/components/schemas/Asset"}},"required":["paymentMethodId","asset"],"example":{"paymentMethodId":"paymentMethod_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.\n\nExamples:\n- EVM address: 0xabc1234567890abcdef1234567890abcdef123456\n- Solana address: HpabPRRCFbBKSuJr5PdkVvQc85FyxyTWkFM2obBRSvHT\n- XRP address: rhccc5p23aKiCGFcEqqnjEfLRZ6xEvfy3s\n"},"network":{"$ref":"#/components/schemas/Network"},"destinationTag":{"type":"string","description":"The destination tag of the onchain address. Destination tags are used by certain networks\n(primarily XRP/Ripple) to identify specific recipients when multiple users share a single address.\nThe tag ensures funds are credited to the correct account within the shared address.\n\nExamples by network:\n- XRP/Ripple: Numeric values like \"1234567890\" or \"123456\"\n- Stellar (XLM): Memos which can be text, ID, or hash format\n\nNote: Most networks (Ethereum, Bitcoin, Solana) do not use destination tags.\n"},"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"}},"TransferSource":{"description":"The source of the transfer.","oneOf":[{"$ref":"#/components/schemas/transfers_Account"},{"$ref":"#/components/schemas/PaymentMethod"},{"$ref":"#/components/schemas/OnchainAddress"}],"example":{}},"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"}},"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"}},"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":{}},"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"}},"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"]},"TransferFees":{"type":"array","description":"The fees associated with this transfer. Different transfer types have different fee structures.\n\n**NOTE:** These examples are not exhaustive.\n\nCommon examples:\n* **Crypto transfers**: Network fees (gas) paid in the native token\n* **Fiat conversions**: Processing fees + exchange fees in USD\n* **Wire transfers**: Wire fees ($15) + processing fees ($5) in USD\n* **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":"Captures estimated values for transfers where amounts can't be guaranteed (e.g., USDC -> EURC).\n\nThe values in `estimate` are not modified after a transfer is executed. They are preserved as an immutable record of the original pre-execution snapshot.\n\nThe actual executed values are populated in the `transfer` resource post-execution.","properties":{"exchangeRate":{"$ref":"#/components/schemas/TransferExchangeRate","description":"The estimated exchange rate at the time this estimate was captured."},"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","description":"The estimated fees at the time this estimate was captured."},"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"}},"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"}},"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"},"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"}]}},"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 received, as a decimal string in standard unit denomination. May be omitted in the `quoted` state if the value cannot be guaranteed; see `estimate.targetAmount` for the expected value. Populated with the actual executed amount once the transfer completes.","example":"100.00"},"targetAsset":{"allOf":[{"$ref":"#/components/schemas/Asset"}],"description":"The asset symbol of the target amount.","example":"usdc"},"exchangeRate":{"$ref":"#/components/schemas/TransferExchangeRate","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. May be omitted in the `quoted` state if the rate cannot be guaranteed; see `estimate.exchangeRate` for the expected rate. Populated with the actual executed rate once the transfer completes."},"fees":{"$ref":"#/components/schemas/TransferFees","description":"The fees associated with this transfer. Different transfer types have different fee structures. May be omitted in the `quoted` state if the fees cannot be guaranteed; see `estimate.fees` for the expected fees. Populated with the actual fees once the transfer completes."},"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"}},"CreateTransferSource":{"description":"The source of the transfer.","oneOf":[{"$ref":"#/components/schemas/transfers_Account"},{"$ref":"#/components/schemas/PaymentMethod"}],"example":{}},"PositiveDecimal":{"type":"string","pattern":"^\\+?(?:(?:0*[1-9]\\d*)(?:\\.\\d*)?|0*\\.\\d*[1-9]\\d*)$","description":"A positive decimal string without scientific notation or whitespace.","example":"100.00"},"TravelRuleParty":{"type":"object","description":"Information about a party (originator or beneficiary) for travel rule compliance.","properties":{"financialInstitution":{"type":"string","description":"Name of the financial institution.","example":"PayPal, Inc."},"name":{"type":"string","description":"Full name of the party.","example":"John Doe"},"address":{"$ref":"#/components/schemas/PhysicalAddress"}},"example":{"name":"John Doe","address":{"line1":"123 Main St","line2":"Unit 201","city":"San Francisco","state":"California","postCode":"94105","countryCode":"US"}}},"DateOfBirth":{"type":"object","description":"Date of birth.","properties":{"day":{"type":"string","description":"Day of birth (01-31).","minLength":2,"maxLength":2,"pattern":"^[0-9]{2}$","example":"15"},"month":{"type":"string","description":"Month of birth (01-12).","minLength":2,"maxLength":2,"pattern":"^[0-9]{2}$","example":"08"},"year":{"type":"string","description":"Year of birth (four digits).","minLength":4,"maxLength":4,"pattern":"^[0-9]{4}$","example":"1990"}},"example":{"day":"15","month":"08","year":"1990"}},"TravelRuleOriginator":{"allOf":[{"$ref":"#/components/schemas/TravelRuleParty"},{"type":"object","properties":{"virtualAssetServiceProvider":{"type":"object","description":"Information about the originating Virtual Asset Service Provider (VASP) that handles cryptocurrency or other virtual assets on behalf of customers.","properties":{"name":{"type":"string","description":"The name of the originating Virtual Asset Service Provider (VASP).","example":"Fidelity Digital Asset Services, LLC"},"address":{"description":"The address of the originating Virtual Asset Service Provider (VASP).","$ref":"#/components/schemas/PhysicalAddress"},"identifier":{"type":"string","description":"The Legal Entity Identifier of the originating Virtual Asset Service Provider (VASP).","example":"5493001KJTIIGC8Y1R17"}}},"personalId":{"type":"string","description":"Personal identifier for travel rule compliance. For individuals: passport number, national ID, or driver's license. For institutions: LEI (Legal Entity Identifier).","example":"123-45-6789"},"dateOfBirth":{"allOf":[{"$ref":"#/components/schemas/DateOfBirth"}],"description":"Date of birth of the originator. Required by certain jurisdictions (such as Coinbase Luxembourg) to satisfy Travel Rule reporting obligations.","example":{"day":"15","month":"08","year":"1990"}}}}],"description":"Originator (sender) party."},"TravelRuleBeneficiary":{"allOf":[{"$ref":"#/components/schemas/TravelRuleParty"},{"type":"object","properties":{"walletType":{"type":"string","description":"The type of the beneficiary's wallet.","enum":["custodial","self_custody"],"example":"custodial"}}}],"description":"Beneficiary (receiver) party."},"TravelRule":{"type":"object","description":"Required Travel Rule fields differ by region. These requirements are determined based on which Coinbase entity the customer has signed the service agreement for.","properties":{"isSelf":{"type":"boolean","description":"Indicates whether the user attests that the receiving wallet belongs to them.","example":true},"isIntermediary":{"type":"boolean","description":"Indicates whether Coinbase is being used as an intermediary Virtual Asset Service Provider (VASP) to send crypto on behalf of your customer.\n\n**Background:**\n\nThe Travel Rule (FATF Recommendation 16) requires VASPs to share originator and beneficiary information for virtual asset transfers. When Coinbase acts as an intermediary, additional Travel Rule data must be provided to satisfy compliance requirements.\n\n**Set to `true` when:**\n\n- Your organization is a VASP using Coinbase to send crypto **on behalf of your end customer**\n- In this scenario, Coinbase acts as an intermediary in the transfer chain and handles Travel Rule data exchange with the beneficiary VASP\n\n**Set to `false` (or omit) when:**\n\n- You are transferring funds directly from your own Coinbase account, where **Coinbase is your primary VASP** rather than an intermediary for another institution\n\n**Impact on required fields:**\n\nWhen `isIntermediary` is `true`, you must provide the `originator` object with details about the **original sender**, including:\n- Originator name\n- Originator address\n- Your VASP information (`virtualAssetServiceProvider` object with `name`, `address`, and `identifier`)\n\nFor jurisdictions that require them (such as Coinbase Luxembourg), `personalIdentification` and `dateOfBirth` must also reflect the **original sender's** identity — not the intermediary's. These fields will not be auto-populated from any internal KYC data when `isIntermediary` is `true`.\n","example":true},"originator":{"$ref":"#/components/schemas/TravelRuleOriginator"},"beneficiary":{"$ref":"#/components/schemas/TravelRuleBeneficiary"}},"example":{"isSelf":false,"isIntermediary":true,"originator":{"name":"John Doe","address":{"line1":"123 Main St","line2":"Unit 201","city":"San Francisco","state":"California","postCode":"94105","countryCode":"US"},"financialInstitution":"PayPal, Inc.","vasp":{"name":"Fidelity Digital Asset Services, LLC","address":{"line1":"123 Market St","line2":"Suite 400","city":"San Francisco","state":"California","postCode":"94105","countryCode":"US"},"identifier":"5493001KJTIIGC8Y1R17"},"personalIdentification":{"type":"social_security_number","value":"123-45-6789","countryOfIssue":"US"},"dateOfBirth":{"day":"15","month":"08","year":"1990"}},"beneficiary":{"name":"Jane Smith","address":{"line1":"456 Oak Ave","city":"Paris","postCode":"75001","countryCode":"FR"},"walletType":"custodial"}}},"TransferRequest":{"type":"object","description":"A request to create a transfer.","properties":{"source":{"$ref":"#/components/schemas/CreateTransferSource"},"target":{"$ref":"#/components/schemas/TransferTarget"},"amount":{"allOf":[{"$ref":"#/components/schemas/PositiveDecimal"}],"description":"The amount of the transfer, as a decimal string in standard unit denomination of the asset specified by `asset` (e.g., \"100.00\" for 100 USD, \"0.05\" for 0.05 ETH).","example":"100.00"},"asset":{"allOf":[{"$ref":"#/components/schemas/Asset"}],"description":"The symbol of the asset for the amount. This must be one of the assets of the source or target.","example":"usd"},"amountType":{"type":"string","default":"source","description":"Specifies whether the given amount is to be received by the target or taken from the source.\n\n- `target`: The transfer `target` receives the exact value specified in `amount`. Fees are added to the amount taken from the transfer `source`.\n- `source`: The transfer `target` receives the value specified in `amount`, minus any fees.\n","enum":["target","source"],"example":"source"},"validateOnly":{"type":"boolean","default":false,"description":"If true, validates the transfer without initiating it.  If the request is valid, a 2xx will be returned. If the request is invalid, a 4xx error will be returned. The response will include an errorType, for e.g. invalid_target if the specified target cannot receive funds.","example":false},"execute":{"type":"boolean","description":"Whether to immediately execute the transfer. If false, the transfer will be created in quoted status and must be executed manually via the /execute endpoint.","example":true},"metadata":{"$ref":"#/components/schemas/Metadata"},"travelRule":{"allOf":[{"$ref":"#/components/schemas/TravelRule"}],"description":"Travel Rule compliance information for this transfer. Required for transfers to external wallets above regulatory thresholds. Fields required differ by region and Coinbase contracting entity.","example":{"isSelf":false,"isIntermediary":false,"originator":{"name":"John Doe","address":{"line1":"123 Main St","city":"San Francisco","state":"CA","postCode":"94105","countryCode":"US"}},"beneficiary":{"name":"Jane Smith","walletType":"custodial"}}}},"required":["source","target","amount","asset","execute"]},"DepositTravelRuleVasp":{"type":"object","description":"Information about the Virtual Asset Service Provider (VASP) for a deposit travel rule submission.","properties":{"identifier":{"type":"string","description":"The Legal Entity Identifier (LEI) of the Virtual Asset Service Provider (VASP).","example":"5493001KJTIIGC8Y1R17"},"name":{"type":"string","description":"The name of the Virtual Asset Service Provider (VASP).","example":"Fidelity Digital Asset Services, LLC"}},"example":{"identifier":"5493001KJTIIGC8Y1R17","name":"Fidelity Digital Asset Services, LLC"}},"DepositTravelRuleOriginator":{"type":"object","description":"Originator information for a deposit travel rule submission.","properties":{"name":{"type":"string","description":"Full name of the originator.","example":"John Doe"},"address":{"$ref":"#/components/schemas/PhysicalAddress"},"walletType":{"type":"string","description":"The type of the originator's wallet.","enum":["custodial","self_custody"],"x-enum-descriptions":["The originator's wallet is held by a custodial service.","The originator's wallet is self-custodied."],"example":"custodial"},"virtualAssetServiceProvider":{"$ref":"#/components/schemas/DepositTravelRuleVasp"},"personalId":{"type":"string","description":"Personal identifier for travel rule compliance. For individuals: passport number, national ID, or driver's license. For institutions: LEI (Legal Entity Identifier).","example":"123-45-6789"},"dateOfBirth":{"allOf":[{"$ref":"#/components/schemas/DateOfBirth"}],"description":"Date of birth of the originator."}},"example":{"name":"John Doe","address":{"line1":"123 Main St","city":"San Francisco","state":"CA","postCode":"94105","countryCode":"US"},"walletType":"custodial","vasp":{"identifier":"5493001KJTIIGC8Y1R17","name":"Fidelity Digital Asset Services, LLC"}}},"DepositTravelRuleBeneficiary":{"type":"object","description":"Beneficiary information for a deposit travel rule submission.","properties":{"name":{"type":"string","description":"Full name of the beneficiary.","example":"Jane Smith"}},"example":{"name":"Jane Smith"}},"DepositTravelRuleRequest":{"type":"object","description":"Request body for submitting travel rule information for a deposit transfer. Required fields vary by jurisdiction.","properties":{"originator":{"allOf":[{"$ref":"#/components/schemas/DepositTravelRuleOriginator"}],"description":"Originator information for the travel rule submission."},"beneficiary":{"allOf":[{"$ref":"#/components/schemas/DepositTravelRuleBeneficiary"}],"description":"Beneficiary information for the travel rule submission."},"isSelf":{"type":"boolean","description":"Indicates whether the user attests that the originating wallet belongs to them.","example":false}},"example":{"originator":{"name":"John Doe","address":{"line1":"123 Main St","city":"San Francisco","state":"CA","postCode":"94105","countryCode":"US"}},"beneficiary":{"name":"Jane Smith"},"isSelf":false}},"DepositTravelRuleResponse":{"type":"object","description":"Response from submitting travel rule information for a deposit transfer.","properties":{"status":{"$ref":"#/components/schemas/TravelRuleStatus"},"missingFields":{"type":"array","description":"List of field paths that are still required to complete travel rule compliance. Each entry is a dot-separated path (e.g., \"originator.name\", \"originator.address.countryCode\"). Empty when status is \"completed\".","items":{"type":"string","example":"originator.name"},"example":["originator.address.countryCode"]},"reason":{"type":"string","description":"Additional context about the current status. Present when status is `incomplete` to explain what needs to be fixed before the transfer can proceed.","example":"Originator date of birth is required."}},"required":["status"],"example":{"status":"incomplete","missingFields":["originator.address.countryCode"]}},"EmailAuthentication":{"type":"object","title":"EmailAuthentication","description":"Information about an end user who authenticates using a one-time password sent to their email address.","properties":{"type":{"type":"string","description":"The type of authentication information.","example":"email","enum":["email"]},"email":{"allOf":[{"$ref":"#/components/schemas/Email"}],"description":"The email address of the end user.","example":"user@example.com"}},"required":["type","email"]},"SmsAuthentication":{"type":"object","title":"SmsAuthentication","description":"Information about an end user who authenticates using a one-time password sent to their phone number via SMS.","properties":{"type":{"type":"string","description":"The type of authentication information.","example":"sms","enum":["sms"]},"phoneNumber":{"allOf":[{"$ref":"#/components/schemas/PhoneNumber"}],"description":"Phone number in [E.164](https://en.wikipedia.org/wiki/E.164) format.","example":"+12055555555"}},"required":["type","phoneNumber"]},"DeveloperJWTAuthentication":{"type":"object","title":"DeveloperJWTAuthentication","description":"Information about an end user who authenticates using a JWT issued by the developer.","properties":{"type":{"type":"string","description":"The type of authentication information.","enum":["jwt"],"example":"jwt"},"kid":{"type":"string","description":"The key ID of the JWK used to sign the JWT.","example":"NjVBRjY5MDlCMUIwNzU4RTA2QzZFMDQ4QzQ2MDAyQjVDNjk1RTM2Qg"},"sub":{"type":"string","description":"The unique identifier for the end user that is captured in the `sub` claim of the JWT.","example":"e051beeb-7163-4527-a5b6-35e301529ff2"}},"required":["type","sub","kid"]},"OAuth2ProviderType":{"type":"string","description":"The type of OAuth2 provider.","enum":["google","apple","x","telegram","github"],"example":"google"},"OAuth2Authentication":{"type":"object","title":"OAuth2Authentication","description":"Information about an end user who authenticates using a third-party provider.","properties":{"type":{"$ref":"#/components/schemas/OAuth2ProviderType"},"sub":{"type":"string","description":"The unique identifier for the end user that is captured in the `sub` claim of the JWT.","example":"e051beeb-7163-4527-a5b6-35e301529ff2"},"email":{"type":"string","description":"The email address of the end user contained within the user's ID token, if available from third-party OAuth2 provider's token exchange.","example":"test.user@gmail.com"},"name":{"type":"string","description":"The full name of the end user if available from third-party OAuth2 provider's token exchange.","example":"Test User"},"username":{"type":"string","description":"The username of the end user if available from third-party OAuth2 provider's token exchange.","example":"test.user"}},"required":["type","sub"]},"TelegramAuthentication":{"type":"object","description":"Information about an end user who authenticates using Telegram.","properties":{"type":{"$ref":"#/components/schemas/OAuth2ProviderType"},"id":{"type":"integer","description":"The Telegram ID for the end user.","example":123456},"firstName":{"type":"string","description":"The Telegram user's first name.","example":"Satoshi"},"lastName":{"type":"string","description":"The Telegram user's last name.","example":"Nakamoto"},"photoUrl":{"type":"string","description":"The Telegram user's profile picture.","example":"https://image.url/profile.png"},"authDate":{"type":"integer","description":"The Telegram user's last login as a Unix timestamp.","example":1770681412},"username":{"type":"string","description":"The Telegram user's username.","example":"satoshinakamoto"}},"required":["type","id","authDate"]},"SiweAuthentication":{"type":"object","title":"SiweAuthentication","description":"Information about an end user who authenticates using Sign In With Ethereum (EIP-4361).","properties":{"type":{"type":"string","description":"The type of authentication information.","example":"siwe","enum":["siwe"]},"address":{"allOf":[{"$ref":"#/components/schemas/BlockchainAddress"}],"description":"The ERC-55 checksummed Ethereum address of the end user.","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"}},"required":["type","address"]},"AuthenticationMethod":{"description":"Information about how the end user is authenticated.","oneOf":[{"$ref":"#/components/schemas/EmailAuthentication"},{"$ref":"#/components/schemas/SmsAuthentication"},{"$ref":"#/components/schemas/DeveloperJWTAuthentication"},{"$ref":"#/components/schemas/OAuth2Authentication"},{"$ref":"#/components/schemas/TelegramAuthentication"},{"$ref":"#/components/schemas/SiweAuthentication"}]},"AuthenticationMethods":{"type":"array","description":"The list of valid authentication methods linked to the end user.","items":{"$ref":"#/components/schemas/AuthenticationMethod"},"example":[{"type":"email","email":"user@example.com"},{"type":"sms","phoneNumber":"+12055555555"},{"type":"jwt","sub":"e051beeb-7163-4527-a5b6-35e301529ff2","kid":"NjVBRjY5MDlCMUIwNzU4RTA2QzZFMDQ4QzQ2MDAyQjVDNjk1RTM2Qg"},{"type":"google","sub":"115346410074741490243","email":"test.user@gmail.com"},{"type":"telegram","id":1223456,"firstName":"Satoshi","lastName":"Nakamoto","photoUrl":"https://image.url/profile.jpg","authDate":1770681412,"username":"satoshinakamoto"},{"type":"siwe","address":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"}]},"MFAMethods":{"x-audience":"public","description":"Information about the end user's MFA enrollments.\n","type":"object","properties":{"enrollmentPromptedAt":{"type":"string","format":"date-time","description":"The date and time when the end user was prompted for MFA enrollment, in ISO 8601 format. If the this field exists, and the user has no other enrolled MFA methods, then the user skipped MFA enrollment.","example":"2025-01-15T10:30:00Z"},"totp":{"type":"object","description":"An object containing information about the end user's TOTP enrollment.","required":["enrolledAt"],"properties":{"enrolledAt":{"type":"string","format":"date-time","description":"The date and time when the method was enrolled, in ISO 8601 format.","example":"2025-01-15T10:30:00Z"}}},"sms":{"type":"object","description":"An object containing information about the end user's SMS MFA enrollment.","required":["enrolledAt"],"properties":{"enrolledAt":{"type":"string","format":"date-time","description":"The date and time when the method was enrolled, in ISO 8601 format.","example":"2025-01-15T10:30:00Z"}}}},"example":{"enrollmentPromptedAt":"2025-01-15T10:30:00Z","totp":{"enrolledAt":"2025-01-15T10:30:00Z"},"sms":{"enrolledAt":"2025-01-15T10:30:00Z"}}},"EndUserEvmAccount":{"type":"object","description":"Information about an EVM account associated with an end user.","properties":{"address":{"type":"string","description":"The address of the EVM account.","pattern":"^0x[0-9a-fA-F]{40}$","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"},"createdAt":{"type":"string","format":"date-time","description":"The date and time when the account was created, in ISO 8601 format.","example":"2025-01-15T10:30:00Z"}},"required":["address","createdAt"]},"EndUserEvmSmartAccount":{"type":"object","description":"Information about an EVM smart account associated with an end user.","properties":{"address":{"type":"string","description":"The address of the EVM smart account.","pattern":"^0x[0-9a-fA-F]{40}$","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"},"ownerAddresses":{"type":"array","description":"The addresses of the EVM EOA accounts that own this smart account. Smart accounts can have multiple owners, such as when spend permissions are enabled.","items":{"type":"string","description":"The address of an EVM EOA account that owns this smart account.","pattern":"^0x[0-9a-fA-F]{40}$","example":"0x1234567890abcdef1234567890abcdef12345678"},"example":["0x1234567890abcdef1234567890abcdef12345678","0xabcdefabcdefabcdefabcdefabcdefabcdefabcd"]},"createdAt":{"type":"string","format":"date-time","description":"The date and time when the account was created, in ISO 8601 format.","example":"2025-01-15T10:30:00Z"}},"required":["address","ownerAddresses","createdAt"]},"EndUserSolanaAccount":{"type":"object","description":"Information about a Solana account associated with an end user.","properties":{"address":{"type":"string","description":"The base58 encoded address of the Solana account.","pattern":"^[1-9A-HJ-NP-Za-km-z]{32,44}$","example":"HpabPRRCFbBKSuJr5PdkVvQc85FyxyTWkFM2obBRSvHT"},"createdAt":{"type":"string","format":"date-time","description":"The date and time when the account was created, in ISO 8601 format.","example":"2025-01-15T10:30:00Z"}},"required":["address","createdAt"]},"EndUser":{"type":"object","description":"Information about the end user.","properties":{"userId":{"description":"A stable, unique identifier for the end user. The `userId` must be unique across all end users in the developer's CDP Project. It must be between 1 and 100 characters long and can only contain alphanumeric characters and hyphens.","type":"string","pattern":"^[a-zA-Z0-9-]{1,100}$","example":"e051beeb-7163-4527-a5b6-35e301529ff2"},"authenticationMethods":{"$ref":"#/components/schemas/AuthenticationMethods"},"mfaMethods":{"$ref":"#/components/schemas/MFAMethods"},"evmAccounts":{"type":"array","deprecated":true,"description":"**DEPRECATED**: Use `evmAccountObjects` instead for richer account information. The list of EVM account addresses associated with the end user. End users can have up to 10 EVM accounts.","items":{"type":"string","description":"The address of the EVM account associated with the end user.","pattern":"^0x[0-9a-fA-F]{40}$","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"},"example":["0x742d35Cc6634C0532925a3b844Bc454e4438f44e"]},"evmAccountObjects":{"type":"array","description":"The list of EVM accounts associated with the end user. End users can have up to 10 EVM accounts.","items":{"$ref":"#/components/schemas/EndUserEvmAccount"},"example":[{"address":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","createdAt":"2025-01-15T10:30:00Z"},{"address":"0x1234567890abcdef1234567890abcdef12345678","createdAt":"2025-01-15T11:00:00Z"}]},"evmSmartAccounts":{"type":"array","deprecated":true,"description":"**DEPRECATED**: Use `evmSmartAccountObjects` instead for richer account information including owner relationships. The list of EVM smart account addresses associated with the end user. Each EVM EOA can own one smart account.","items":{"type":"string","description":"The address of the EVM smart account associated with the end user.","pattern":"^0x[0-9a-fA-F]{40}$","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"},"example":["0x742d35Cc6634C0532925a3b844Bc454e4438f44e"]},"evmSmartAccountObjects":{"type":"array","description":"The list of EVM smart accounts associated with the end user. Each EVM EOA can own one smart account.","items":{"$ref":"#/components/schemas/EndUserEvmSmartAccount"},"example":[{"address":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","ownerAddresses":["0x1234567890abcdef1234567890abcdef12345678","0xabcdefabcdefabcdefabcdefabcdefabcdefabcd"],"createdAt":"2025-01-15T12:00:00Z"}]},"solanaAccounts":{"type":"array","deprecated":true,"description":"**DEPRECATED**: Use `solanaAccountObjects` instead for richer account information. The list of Solana account addresses associated with the end user. End users can have up to 10 Solana accounts.","items":{"type":"string","description":"The base58 encoded address of the Solana account associated with the end user.","pattern":"^[1-9A-HJ-NP-Za-km-z]{32,44}$","example":"HpabPRRCFbBKSuJr5PdkVvQc85FyxyTWkFM2obBRSvHT"},"example":["HpabPRRCFbBKSuJr5PdkVvQc85FyxyTWkFM2obBRSvHT"]},"solanaAccountObjects":{"type":"array","description":"The list of Solana accounts associated with the end user. End users can have up to 10 Solana accounts.","items":{"$ref":"#/components/schemas/EndUserSolanaAccount"},"example":[{"address":"HpabPRRCFbBKSuJr5PdkVvQc85FyxyTWkFM2obBRSvHT","createdAt":"2025-01-15T10:30:00Z"},{"address":"9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin","createdAt":"2025-01-15T11:30:00Z"}]},"createdAt":{"type":"string","format":"date-time","description":"The date and time when the end user was created, in ISO 8601 format.","example":"2025-01-15T10:30:00Z"}},"required":["userId","authenticationMethods","evmAccounts","evmAccountObjects","evmSmartAccounts","evmSmartAccountObjects","solanaAccounts","solanaAccountObjects","createdAt"]},"PaymasterContext":{"type":"object","additionalProperties":true,"description":"The ERC-7677 `context` object forwarded to the paymaster service as part of the `paymasterService` capability. The fields in this object are defined by the paymaster service provider; CDP forwards them to the paymaster unchanged. This field is only valid when a paymaster is configured for the request. Providing `paymasterContext` without a paymaster configured results in an `invalid_request` error.","example":{"policyId":"962b252c-a726-4a37-8d86-333ce0a07299"}},"EIP712Domain":{"type":"object","description":"The domain of the EIP-712 typed data.","properties":{"name":{"type":"string","description":"The name of the DApp or protocol.","example":"Permit2"},"version":{"type":"string","description":"The version of the DApp or protocol.","example":"1"},"chainId":{"type":"integer","format":"int64","description":"The chain ID of the EVM network.","example":1},"verifyingContract":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$","description":"The 0x-prefixed EVM address of the verifying smart contract.","example":"0x000000000022D473030F116dDEE9F6B43aC78BA3"},"salt":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$","description":"The optional 32-byte 0x-prefixed hex salt for domain separation.","example":"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"}},"example":{"name":"Permit2","chainId":1,"verifyingContract":"0x000000000022D473030F116dDEE9F6B43aC78BA3"}},"EIP712Types":{"type":"object","description":"A mapping of struct names to an array of type objects (name + type).\nEach key corresponds to a type name (e.g., \"`EIP712Domain`\", \"`PermitTransferFrom`\").\n","example":{"EIP712Domain":[{"name":"name","type":"string"},{"name":"chainId","type":"uint256"},{"name":"verifyingContract","type":"address"}],"PermitTransferFrom":[{"name":"permitted","type":"TokenPermissions"},{"name":"spender","type":"address"},{"name":"nonce","type":"uint256"},{"name":"deadline","type":"uint256"}],"TokenPermissions":[{"name":"token","type":"address"},{"name":"amount","type":"uint256"}]}},"EIP712Message":{"type":"object","description":"The message to sign using EIP-712.","properties":{"domain":{"$ref":"#/components/schemas/EIP712Domain"},"types":{"$ref":"#/components/schemas/EIP712Types"},"primaryType":{"type":"string","description":"The primary type of the message. This is the name of the struct in the `types` object that is the root of the message.","example":"PermitTransferFrom"},"message":{"type":"object","description":"The message to sign. The structure of this message must match the `primaryType` struct in the `types` object.","example":{"permitted":{"token":"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48","amount":"1000000"},"spender":"0x1111111254EEB25477B68fb85Ed929f73A960582","nonce":"0","deadline":"1716239020"}}},"required":["domain","types","primaryType","message"],"example":{"domain":{"name":"Permit2","chainId":1,"verifyingContract":"0x000000000022D473030F116dDEE9F6B43aC78BA3"},"types":{"EIP712Domain":[{"name":"name","type":"string"},{"name":"chainId","type":"uint256"},{"name":"verifyingContract","type":"address"}],"PermitTransferFrom":[{"name":"permitted","type":"TokenPermissions"},{"name":"spender","type":"address"},{"name":"nonce","type":"uint256"},{"name":"deadline","type":"uint256"}],"TokenPermissions":[{"name":"token","type":"address"},{"name":"amount","type":"uint256"}]},"primaryType":"PermitTransferFrom","message":{"permitted":{"token":"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48","amount":"1000000"},"spender":"0xFfFfFfFFfFFfFFfFFfFFFFFffFFFffffFfFFFfFf","nonce":"123456","deadline":"1717123200"}}},"EvmEip7702DelegationNetwork":{"type":"string","description":"The network for the EIP-7702 delegation.","enum":["base-sepolia","base","arbitrum","optimism","polygon","ethereum","ethereum-sepolia"],"example":"base"},"EvmUserOperationNetwork":{"type":"string","description":"The network the user operation is for.","enum":["base-sepolia","base","arbitrum","optimism","zora","polygon","bnb","avalanche","ethereum","ethereum-sepolia"],"example":"base"},"EvmCall":{"type":"object","properties":{"to":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"The address the call is directed to.","example":"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},"value":{"type":"string","description":"The amount of ETH to send with the call, in wei.","example":"0"},"data":{"type":"string","pattern":"^0x[0-9a-fA-F]*$","description":"The call data to send. This is the hex-encoded data of the function call consisting of the method selector and the function arguments.","example":"0xa9059cbb000000000000000000000000fc807d1be4997e5c7b33e4d8d57e60c5b0f02b1a0000000000000000000000000000000000000000000000000000000000000064"},"overrideGasLimit":{"type":"string","description":"The override gas limit to use for the call instead of the bundler's estimated gas limit.","example":"100000"}},"required":["to","value","data"]},"UserOperationReceiptRevert":{"type":"object","description":"The revert data if the user operation has reverted.","properties":{"data":{"type":"string","pattern":"^0x[0-9a-fA-F]*$","description":"The 0x-prefixed raw hex string.","example":"0x123"},"message":{"type":"string","description":"Human-readable revert reason if able to decode.","example":"reason for failure"}},"required":["data","message"],"example":{"data":"0x123","message":"reason for failure"}},"UserOperationReceipt":{"type":"object","description":"The receipt that contains information about the execution of user operation.","properties":{"revert":{"$ref":"#/components/schemas/UserOperationReceiptRevert"},"transactionHash":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$","description":"The hash of this transaction as 0x-prefixed string.","example":"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"},"blockHash":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$|^$","description":"The block hash of the block including the transaction as 0x-prefixed string.","example":"0x386544b58930c0ec9e8f3ed09fb4cdb76b9ae0a1a37ddcacebe3925b57978e65"},"blockNumber":{"type":"integer","description":"The block height (number) of the block including the transaction.","example":29338819},"gasUsed":{"type":"string","description":"The gas used for landing this user operation.","example":"100000"}},"example":{"revert":{"data":"0x123","message":"reason for failure"},"blockHash":"0x386544b58930c0ec9e8f3ed09fb4cdb76b9ae0a1a37ddcacebe3925b57978e65","blockNumber":29338819,"gasUsed":"100000"}},"EvmUserOperation":{"type":"object","properties":{"network":{"$ref":"#/components/schemas/EvmUserOperationNetwork"},"userOpHash":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$","description":"The hash of the user operation. This is not the transaction hash, as a transaction consists of multiple user operations. The user operation hash is the hash of this particular user operation which gets signed by the owner of the Smart Account.","example":"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"},"calls":{"type":"array","description":"The list of calls in the user operation.","items":{"$ref":"#/components/schemas/EvmCall"},"example":[{"to":"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48","value":"0","data":"0xa9059cbb000000000000000000000000fc807d1be4997e5c7b33e4d8d57e60c5b0f02b1a0000000000000000000000000000000000000000000000000000000000000064"},{"to":"0xdac17f958d2ee523a2206206994597c13d831ec7","value":"1000000000000000","data":"0x"}]},"status":{"type":"string","description":"The status of the user operation.","enum":["pending","signed","broadcast","complete","dropped","failed"],"example":"pending"},"transactionHash":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$|^$","description":"The hash of the transaction that included this particular user operation. This gets set after the user operation is broadcasted and the transaction is included in a block.","example":"0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"},"receipts":{"type":"array","description":"The list of receipts associated with the user operation.","items":{"$ref":"#/components/schemas/UserOperationReceipt"},"example":[{"revert":{"data":"0x123","message":"reason for failure"},"blockHash":"0x386544b58930c0ec9e8f3ed09fb4cdb76b9ae0a1a37ddcacebe3925b57978e65","blockNumber":29338819,"gasUsed":"100000"}]},"expiresAt":{"type":"string","description":"The timestamp at which the prepared user operation expires.","example":"2025-03-25T12:00:00Z","format":"date-time"}},"required":["network","userOpHash","calls","status"]},"X402Version":{"type":"integer","description":"The version of the x402 protocol.","enum":[1,2],"example":2},"X402V2Network":{"type":"string","description":"The x402 v2 network identifier in CAIP-2 format. x402 v2 identifies networks by their CAIP-2 chain ID (e.g. `eip155:<chainId>` for EVM networks, `solana:<genesisHash>` for Solana). Supported networks: Base, Polygon, Arbitrum One, World Chain (EVM), and Solana.","enum":["eip155:8453","eip155:84532","eip155:137","eip155:42161","eip155:480","eip155:4801","solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1"],"example":"eip155:8453"},"x402V2PaymentRequirements":{"type":"object","title":"x402V2PaymentRequirements","description":"The x402 v2 payment requirements. Uses CAIP-2 network identifiers and supports `exact`, `upto`, and `batch-settlement` schemes. Carries only the payment fields (no resource metadata — that is in the enclosing `x402V2PaymentPayload.resource`).","properties":{"scheme":{"type":"string","description":"The scheme of the payment protocol to use. Supported schemes are `exact`, `upto`, and `batch-settlement`.","enum":["exact","upto","batch-settlement"],"example":"exact"},"network":{"allOf":[{"$ref":"#/components/schemas/X402V2Network"}],"description":"The network of the blockchain to send payment on in CAIP-2 format.","example":"eip155:8453"},"asset":{"allOf":[{"$ref":"#/components/schemas/BlockchainAddress"}],"description":"The asset to pay with.\n\nFor EVM networks, the asset will be a 0x-prefixed, checksum EVM address.\n\nFor Solana-based networks, the asset will be a base58-encoded Solana address.","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"},"amount":{"type":"string","description":"The amount to pay for the resource in atomic units of the payment asset.","example":"1000000"},"payTo":{"allOf":[{"$ref":"#/components/schemas/BlockchainAddress"}],"description":"The destination to pay value to.\n\nFor EVM networks, payTo will be a 0x-prefixed, checksum EVM address.\n\nFor Solana-based networks, payTo will be a base58-encoded Solana address.","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"},"maxTimeoutSeconds":{"type":"integer","description":"The maximum time in seconds for the resource server to respond.","example":10},"extra":{"type":"object","description":"The optional additional scheme-specific payment info.","additionalProperties":true,"example":{"name":"USDC","version":"2"}}},"required":["scheme","network","asset","amount","payTo","maxTimeoutSeconds"]},"X402V1Network":{"type":"string","description":"The x402 v1 network identifier. x402 v1 uses human-readable network names. Supported networks: Base mainnet and testnet, Solana mainnet and devnet.","enum":["base","base-sepolia","solana","solana-devnet"],"example":"base"},"Description":{"type":"string","minLength":0,"maxLength":500,"description":"A human-readable description.","example":"A description of the resource."},"x402V1PaymentRequirements":{"type":"object","title":"x402V1PaymentRequirements","description":"The x402 v1 payment requirements. Uses human-readable network names, and carries resource metadata (`resource`, `description`, `mimeType`) alongside the payment fields. The only supported scheme is `exact`.","properties":{"scheme":{"type":"string","description":"The scheme of the payment protocol to use. Currently, the only supported scheme is `exact`.","enum":["exact"],"example":"exact"},"network":{"allOf":[{"$ref":"#/components/schemas/X402V1Network"}],"description":"The network of the blockchain to send payment on.","example":"base"},"maxAmountRequired":{"type":"string","description":"The maximum amount required to pay for the resource in atomic units of the payment asset.","example":"1000000"},"resource":{"type":"string","description":"The URL of the resource to pay for.","example":"https://api.example.com/premium/resource/123"},"description":{"allOf":[{"$ref":"#/components/schemas/Description"}],"description":"A human-readable description of the resource.","example":"Premium API access for data analysis"},"mimeType":{"type":"string","description":"The MIME type of the resource response.","example":"application/json"},"outputSchema":{"type":"object","description":"The optional JSON schema describing the resource output.","additionalProperties":true,"example":{"data":"string"}},"payTo":{"allOf":[{"$ref":"#/components/schemas/BlockchainAddress"}],"description":"The destination to pay value to.\n\nFor EVM networks, payTo will be a 0x-prefixed, checksum EVM address.\n\nFor Solana-based networks, payTo will be a base58-encoded Solana address.","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"},"maxTimeoutSeconds":{"type":"integer","description":"The maximum time in seconds for the resource server to respond.","example":10},"asset":{"allOf":[{"$ref":"#/components/schemas/BlockchainAddress"}],"description":"The asset to pay with.\n\nFor EVM networks, the asset will be a 0x-prefixed, checksum EVM address.\n\nFor Solana-based networks, the asset will be a base58-encoded Solana address.","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"},"extra":{"type":"object","description":"The optional additional scheme-specific payment info.","additionalProperties":true,"example":{"gasLimit":"1000000"}}},"required":["scheme","network","maxAmountRequired","resource","description","mimeType","payTo","asset","maxTimeoutSeconds"]},"x402PaymentRequirements":{"type":"object","description":"The x402 protocol payment requirements that the resource server expects the client's payment payload to meet.","oneOf":[{"$ref":"#/components/schemas/x402V2PaymentRequirements"},{"$ref":"#/components/schemas/x402V1PaymentRequirements"}]},"x402ResourceInfo":{"type":"object","description":"Describes the resource being accessed in x402 protocol.","properties":{"url":{"type":"string","description":"The URL of the resource.","example":"https://api.example.com/premium/resource/123"},"description":{"allOf":[{"$ref":"#/components/schemas/Description"}],"description":"A human-readable description of the resource.","example":"Premium API access for data analysis"},"mimeType":{"type":"string","description":"The MIME type of the resource response.","example":"application/json"}}},"x402PaymentRequired":{"type":"object","description":"The x402 protocol payment required response body, returned by a resource server when a request lacks valid payment. Contains the accepted payment options, optional resource metadata, and an optional error message from the resource server.","properties":{"x402Version":{"allOf":[{"$ref":"#/components/schemas/X402Version"}],"description":"The x402 protocol version.","example":2},"accepts":{"type":"array","description":"The list of payment options the resource server accepts. At least one option must be present.","minItems":1,"maxItems":16,"items":{"$ref":"#/components/schemas/x402PaymentRequirements"},"example":[{"scheme":"exact","network":"eip155:8453","amount":"1000000","asset":"0x036CbD53842c5426634e7929541eC2318f3dCF7e","payTo":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","maxTimeoutSeconds":60},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"1000000","asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","payTo":"2wKupLR9q6wXYppw8Gr2NvWxKBUqm4PPJKkQfoxHDBg4","maxTimeoutSeconds":60}]},"resource":{"allOf":[{"$ref":"#/components/schemas/x402ResourceInfo"}],"description":"Optional metadata about the resource being paid for.","example":{"url":"https://api.example.com/premium/resource/123","description":"Premium API access for data analysis.","mimeType":"application/json"}},"error":{"type":"string","description":"An optional error message from the resource server describing why payment is required.","example":"PAYMENT-SIGNATURE header is required"},"extensions":{"type":"object","description":"Optional protocol extensions. Unknown keys are forwarded as-is into the signed payment payload.","additionalProperties":true,"example":{}}},"required":["x402Version","accepts"]},"x402ExactEvmPayload":{"type":"object","title":"x402ExactEvmPayload","description":"The x402 protocol exact scheme payload for EVM networks. The scheme is implemented using ERC-3009. For more details, please see [EVM Exact Scheme Details](https://github.com/coinbase/x402/blob/main/specs/schemes/exact/scheme_exact_evm.md).","properties":{"signature":{"type":"string","pattern":"^0x[0-9a-fA-F]{130,}$","description":"The EIP-712 hex-encoded signature of the ERC-3009 authorization message. Smart account signatures may be longer than 65 bytes.","example":"0xf3746613c2d920b5fdabc0856f2aeb2d4f88ee6037b8cc5d04a71a4462f134801234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1b"},"authorization":{"type":"object","description":"The authorization data for the ERC-3009 authorization message.","properties":{"from":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"The 0x-prefixed, checksum EVM address of the sender of the payment.","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"},"to":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"The 0x-prefixed, checksum EVM address of the recipient of the payment.","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"},"value":{"type":"string","description":"The value of the payment, in atomic units of the payment asset.","example":"1000000000000000000"},"validAfter":{"type":"string","description":"The unix timestamp after which the payment is valid.","example":"1716150000"},"validBefore":{"type":"string","description":"The unix timestamp before which the payment is valid.","example":"1716150000"},"nonce":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$","description":"The hex-encoded nonce of the payment (bytes32).","example":"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"}},"example":{"from":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","to":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","value":"1000000000000000000","validAfter":"1716150000","validBefore":"1716150000","nonce":"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"},"required":["from","to","value","validAfter","validBefore","nonce"]}},"example":{"signature":"0xf3746613c2d920b5fdabc0856f2aeb2d4f88ee6037b8cc5d04a71a4462f134801234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1b","authorization":{"from":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","to":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","value":"1000000000000000000","validAfter":"1716150000","validBefore":"1716150000","nonce":"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"}},"required":["signature","authorization"]},"x402ExactEvmPermit2Payload":{"type":"object","title":"x402ExactEvmPermit2Payload","description":"The x402 protocol exact scheme payload for EVM networks using Permit2. Permit2 is a universal token approval mechanism that works with any ERC-20 token, unlike ERC-3009 which requires token-level support.","properties":{"signature":{"type":"string","pattern":"^0x[0-9a-fA-F]{130,}$","description":"The EIP-712 hex-encoded signature of the Permit2 PermitWitnessTransferFrom message. Smart account signatures may be longer than 65 bytes.","example":"0xf3746613c2d920b5fdabc0856f2aeb2d4f88ee6037b8cc5d04a71a4462f134801234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1b"},"permit2Authorization":{"type":"object","description":"The authorization data for the Permit2 PermitWitnessTransferFrom message.","properties":{"from":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"The 0x-prefixed, checksum EVM address of the sender of the payment.","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"},"permitted":{"type":"object","description":"The token permissions for the transfer.","properties":{"token":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"The 0x-prefixed, checksum EVM address of the token to transfer.","example":"0x036CbD53842c5426634e7929541eC2318f3dCF7e"},"amount":{"type":"string","description":"The amount to transfer in atomic units.","example":"1000000"}},"required":["token","amount"]},"spender":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"The 0x-prefixed, checksum EVM address of the spender (x402 Permit2 proxy contract).","example":"0x4020615294c913F045dc10f0a5cdEbd86c280001"},"nonce":{"type":"string","pattern":"^[0-9]+$","description":"The Permit2 nonce as a decimal string (uint256).","example":"12345678901234567890"},"deadline":{"type":"string","description":"The unix timestamp before which the permit is valid.","example":"1716150000"},"witness":{"type":"object","description":"The witness data containing payment details.","properties":{"to":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"The 0x-prefixed, checksum EVM address of the recipient.","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"},"validAfter":{"type":"string","description":"The unix timestamp after which the payment is valid.","example":"1716150000"},"extra":{"type":"string","pattern":"^0x[0-9a-fA-F]*$","description":"Optional hex-encoded extra data.","example":"0x"}},"additionalProperties":false,"required":["to","validAfter"]}},"example":{"from":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","permitted":{"token":"0x036CbD53842c5426634e7929541eC2318f3dCF7e","amount":"1000000"},"spender":"0x4020615294c913F045dc10f0a5cdEbd86c280001","nonce":"12345678901234567890","deadline":"1716150000","witness":{"to":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","validAfter":"1716150000","extra":"0x"}},"required":["from","permitted","spender","nonce","deadline","witness"]}},"example":{"signature":"0xf3746613c2d920b5fdabc0856f2aeb2d4f88ee6037b8cc5d04a71a4462f134801234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1b","permit2Authorization":{"from":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","permitted":{"token":"0x036CbD53842c5426634e7929541eC2318f3dCF7e","amount":"1000000"},"spender":"0x4020615294c913F045dc10f0a5cdEbd86c280001","nonce":"12345678901234567890","deadline":"1716150000","witness":{"to":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","validAfter":"1716150000","extra":"0x"}}},"required":["signature","permit2Authorization"]},"x402ExactSolanaPayload":{"type":"object","title":"x402ExactSolanaPayload","description":"The x402 protocol exact scheme payload for Solana networks. For more details, please see [Solana Exact Scheme Details](https://github.com/coinbase/x402/blob/main/specs/schemes/exact/scheme_exact_svm.md).","properties":{"transaction":{"type":"string","description":"The base64-encoded Solana transaction.","example":"AQABAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAQECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8CBgMBAQAAAAIBAwQAAAAABgIAAAAAAAYDBQEBAAAGBAgAAAAABgUAAAAA6AMAAAAAAAAGBgUBAQEBBgcEAQAAAAYICgMBAQIDBgkCBgAAAAYKAwABAQEGCwMGAQEBBgwDAAABAQAAAAA="}},"example":{"transaction":"AQABAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAQECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8CBgMBAQAAAAIBAwQAAAAABgIAAAAAAAYDBQEBAAAGBAgAAAAABgUAAAAA6AMAAAAAAAAGBgUBAQEBBgcEAQAAAAYICgMBAQIDBgkCBgAAAAYKAwABAQEGCwMGAQEBBgwDAAABAQAAAAA="},"required":["transaction"]},"x402UptoEvmPermit2Payload":{"type":"object","title":"x402UptoEvmPermit2Payload","description":"The x402 protocol upto scheme payload for EVM networks using Permit2. The `upto` scheme authorizes a maximum amount and lets the facilitator settle for the actual amount used. Structurally identical to `x402ExactEvmPermit2Payload` except `permit2Authorization.witness` carries an additional `facilitator` address that binds the authorization to a specific facilitator (the one announced via `extra.facilitatorAddress` in the payment requirements). For more details, see [EVM Upto Scheme Details](https://github.com/x402-foundation/x402/blob/main/specs/schemes/upto/scheme_upto_evm.md).","properties":{"signature":{"type":"string","pattern":"^0x[0-9a-fA-F]{130,}$","description":"The EIP-712 hex-encoded signature of the Permit2 PermitWitnessTransferFrom message. Smart account signatures may be longer than 65 bytes.","example":"0xf3746613c2d920b5fdabc0856f2aeb2d4f88ee6037b8cc5d04a71a4462f134801234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1b"},"permit2Authorization":{"type":"object","description":"The authorization data for the Permit2 PermitWitnessTransferFrom message. The `permitted.amount` is the maximum the client authorizes; the actual settled amount is decided by the resource server at settle time and MUST be less than or equal to it.","properties":{"from":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"The 0x-prefixed, checksum EVM address of the sender of the payment.","example":"0x857b06519E91e3A54538791bDbb0E22373e36b66"},"permitted":{"type":"object","description":"The token permissions for the transfer.","properties":{"token":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"The 0x-prefixed, checksum EVM address of the token to transfer.","example":"0x036CbD53842c5426634e7929541eC2318f3dCF7e"},"amount":{"type":"string","description":"The maximum amount the client authorizes to transfer in atomic units.","example":"5000000"}},"required":["token","amount"]},"spender":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"The 0x-prefixed, checksum EVM address of the spender (the x402 Upto Permit2 proxy contract).","example":"0x4020A4f3b7b90ccA423B9fabCc0CE57C6C240002"},"nonce":{"type":"string","pattern":"^[0-9]+$","description":"The Permit2 nonce as a decimal string (uint256).","example":"12345678901234567890"},"deadline":{"type":"string","description":"The unix timestamp before which the permit is valid.","example":"1740672154"},"witness":{"type":"object","description":"The witness data containing payment details. Includes a `facilitator` field to bind the authorization to a specific facilitator address.","properties":{"to":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"The 0x-prefixed, checksum EVM address of the recipient.","example":"0x209693Bc6afc0C5328bA36FaF03C514EF312287C"},"facilitator":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"The 0x-prefixed, checksum EVM address of the facilitator authorized to settle this payment. MUST match the `facilitatorAddress` advertised in the payment requirements `extra` field.","example":"0x1111111111111111111111111111111111111111"},"validAfter":{"type":"string","description":"The unix timestamp after which the payment is valid.","example":"1740672089"}},"required":["to","facilitator","validAfter"]}},"required":["from","permitted","spender","nonce","deadline","witness"]}},"example":{"signature":"0x2d6a7588d6acca505cbf0d9a4a227e0c52c6c34008c8e8986a1283259764173608a2ce6496642e377d6da8dbbf5836e9bd15092f9ecab05ded3d6293af148b571c","permit2Authorization":{"from":"0x857b06519E91e3A54538791bDbb0E22373e36b66","permitted":{"token":"0x036CbD53842c5426634e7929541eC2318f3dCF7e","amount":"5000000"},"spender":"0x4020A4f3b7b90ccA423B9fabCc0CE57C6C240002","nonce":"12345678901234567890","deadline":"1740672154","witness":{"to":"0x209693Bc6afc0C5328bA36FaF03C514EF312287C","facilitator":"0x1111111111111111111111111111111111111111","validAfter":"1740672089"}}},"required":["signature","permit2Authorization"]},"x402BatchSettlementChannelConfig":{"type":"object","title":"x402BatchSettlementChannelConfig","description":"Immutable configuration for an x402 batch-settlement payment channel. The EIP-712 hash of this struct produces the `channelId` used by all batch-settlement payloads.","properties":{"payer":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"The 0x-prefixed, checksum EVM address of the payer (channel funder).","example":"0x857b06519E91e3A54538791bDbb0E22373e36b66"},"payerAuthorizer":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"The 0x-prefixed, checksum EVM address authorized to sign vouchers on behalf of the payer.","example":"0x857b06519E91e3A54538791bDbb0E22373e36b66"},"receiver":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"The 0x-prefixed, checksum EVM address of the receiver (resource server / merchant).","example":"0x209693Bc6afc0C5328bA36FaF03C514EF312287C"},"receiverAuthorizer":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"The 0x-prefixed, checksum EVM address authorized to sign claim batches on behalf of the receiver (typically the facilitator).","example":"0x1111111111111111111111111111111111111111"},"token":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"The 0x-prefixed, checksum EVM address of the ERC-20 payment token.","example":"0x036CbD53842c5426634e7929541eC2318f3dCF7e"},"withdrawDelay":{"type":"integer","description":"The non-cooperative withdraw delay in seconds. Must be between 900 (15 minutes) and 2,592,000 (30 days).","minimum":900,"maximum":2592000,"example":86400},"salt":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$","description":"A 32-byte salt used to differentiate channels between the same payer/receiver pair.","example":"0x0000000000000000000000000000000000000000000000000000000000000001"}},"required":["payer","payerAuthorizer","receiver","receiverAuthorizer","token","withdrawDelay","salt"],"example":{"payer":"0x857b06519E91e3A54538791bDbb0E22373e36b66","payerAuthorizer":"0x857b06519E91e3A54538791bDbb0E22373e36b66","receiver":"0x209693Bc6afc0C5328bA36FaF03C514EF312287C","receiverAuthorizer":"0x1111111111111111111111111111111111111111","token":"0x036CbD53842c5426634e7929541eC2318f3dCF7e","withdrawDelay":86400,"salt":"0x0000000000000000000000000000000000000000000000000000000000000001"}},"x402BatchSettlementVoucher":{"type":"object","title":"x402BatchSettlementVoucher","description":"A signed cumulative-ceiling voucher for an x402 batch-settlement channel. `maxClaimableAmount` is monotonically increasing across requests in the same channel; the receiver may claim any amount up to this ceiling.","properties":{"channelId":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$","description":"The 32-byte EIP-712 hash of the `channelConfig` for this voucher's channel.","example":"0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890"},"maxClaimableAmount":{"type":"string","pattern":"^[0-9]+$","description":"The cumulative maximum amount (uint128 as decimal string) the receiver is authorized to claim from this channel as of this voucher.","example":"5000000"},"signature":{"type":"string","pattern":"^0x[0-9a-fA-F]+$","description":"The EIP-712 hex-encoded signature of the voucher by `payerAuthorizer`.","example":"0xf3746613c2d920b5fdabc0856f2aeb2d4f88ee6037b8cc5d04a71a4462f134801234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1b"}},"required":["channelId","maxClaimableAmount","signature"],"example":{"channelId":"0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890","maxClaimableAmount":"5000000","signature":"0xf3746613c2d920b5fdabc0856f2aeb2d4f88ee6037b8cc5d04a71a4462f134801234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1b"}},"x402BatchSettlementDepositPayload":{"type":"object","title":"x402BatchSettlementDepositPayload","description":"Sent on the first request to fund a channel via an ERC-3009 receiveWithAuthorization deposit.","properties":{"type":{"type":"string","description":"The payload-type discriminator. Must be `\"deposit\"` for a channel-funding deposit payload.","enum":["deposit"]},"channelConfig":{"$ref":"#/components/schemas/x402BatchSettlementChannelConfig"},"voucher":{"$ref":"#/components/schemas/x402BatchSettlementVoucher"},"deposit":{"type":"object","description":"The deposit amount and asset-transfer authorization that funds the channel.","properties":{"amount":{"type":"string","pattern":"^[0-9]+$","description":"The deposit amount in atomic units of `channelConfig.token`.","example":"10000000"},"authorization":{"type":"object","description":"The asset-transfer authorization for the deposit. Currently only ERC-3009 is supported.","properties":{"erc3009Authorization":{"type":"object","description":"An ERC-3009 receiveWithAuthorization message authorizing the channel-funding transfer.","properties":{"validAfter":{"type":"string","description":"The unix timestamp after which the authorization is valid.","example":"1716150000"},"validBefore":{"type":"string","description":"The unix timestamp before which the authorization is valid.","example":"1716160000"},"salt":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$","description":"The 32-byte ERC-3009 nonce/salt for replay protection.","example":"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"},"signature":{"type":"string","pattern":"^0x[0-9a-fA-F]+$","description":"The EIP-712 hex-encoded signature of the ERC-3009 authorization.","example":"0xf3746613c2d920b5fdabc0856f2aeb2d4f88ee6037b8cc5d04a71a4462f134801234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1b"}},"required":["validAfter","validBefore","salt","signature"]}}}},"required":["amount","authorization"]}},"required":["type","channelConfig","voucher","deposit"],"example":{"type":"deposit","channelConfig":{"payer":"0x857b06519E91e3A54538791bDbb0E22373e36b66","payerAuthorizer":"0x857b06519E91e3A54538791bDbb0E22373e36b66","receiver":"0x209693Bc6afc0C5328bA36FaF03C514EF312287C","receiverAuthorizer":"0x1111111111111111111111111111111111111111","token":"0x036CbD53842c5426634e7929541eC2318f3dCF7e","withdrawDelay":86400,"salt":"0x0000000000000000000000000000000000000000000000000000000000000001"},"voucher":{"channelId":"0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890","maxClaimableAmount":"5000000","signature":"0xf3746613c2d920b5fdabc0856f2aeb2d4f88ee6037b8cc5d04a71a4462f134801234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1b"},"deposit":{"amount":"10000000","authorization":{"erc3009Authorization":{"validAfter":"1716150000","validBefore":"1716160000","salt":"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef","signature":"0xf3746613c2d920b5fdabc0856f2aeb2d4f88ee6037b8cc5d04a71a4462f134801234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1b"}}}}},"x402BatchSettlementVoucherPayload":{"type":"object","title":"x402BatchSettlementVoucherPayload","description":"Sent on subsequent requests against an already-funded channel; carries only the latest cumulative voucher.","properties":{"type":{"type":"string","description":"The payload-type discriminator. Must be `\"voucher\"` for a voucher-only payment against an already-funded channel.","enum":["voucher"]},"channelConfig":{"$ref":"#/components/schemas/x402BatchSettlementChannelConfig"},"voucher":{"$ref":"#/components/schemas/x402BatchSettlementVoucher"}},"required":["type","channelConfig","voucher"],"example":{"type":"voucher","channelConfig":{"payer":"0x857b06519E91e3A54538791bDbb0E22373e36b66","payerAuthorizer":"0x857b06519E91e3A54538791bDbb0E22373e36b66","receiver":"0x209693Bc6afc0C5328bA36FaF03C514EF312287C","receiverAuthorizer":"0x1111111111111111111111111111111111111111","token":"0x036CbD53842c5426634e7929541eC2318f3dCF7e","withdrawDelay":86400,"salt":"0x0000000000000000000000000000000000000000000000000000000000000001"},"voucher":{"channelId":"0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890","maxClaimableAmount":"5000000","signature":"0xf3746613c2d920b5fdabc0856f2aeb2d4f88ee6037b8cc5d04a71a4462f134801234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1b"}}},"x402BatchSettlementClaim":{"type":"object","title":"x402BatchSettlementClaim","description":"A single voucher claim within a batched on-chain claim transaction. Used by `x402BatchSettlementClaimPayload.claims` and by the server-enriched shape of `x402BatchSettlementRefundPayload.claims`.\nNOTE: the nested `voucher` here has a **different shape** from the top-level `x402BatchSettlementVoucher` schema. The top-level voucher is the signed cumulative-ceiling message sent by a client (`{channelId, maxClaimableAmount, signature}`). This nested `voucher` mirrors the on-chain claim struct (`{channel: ChannelConfig, maxClaimableAmount}`) that participates in the EIP-712 hash, with `signature` and `totalClaimed` as siblings rather than nested fields. The field names match the upstream x402 protocol and the on-chain Solidity struct; they cannot be renamed without breaking wire and EIP-712 compatibility.","properties":{"voucher":{"type":"object","description":"The voucher to claim, identified by the channel config it was signed against and its cumulative ceiling. Field shape mirrors the on-chain claim struct.","properties":{"channel":{"$ref":"#/components/schemas/x402BatchSettlementChannelConfig"},"maxClaimableAmount":{"type":"string","pattern":"^[0-9]+$","description":"The cumulative maximum claimable amount (uint128 as decimal string) signed by the payer authorizer.","example":"5000000"}},"required":["channel","maxClaimableAmount"]},"signature":{"type":"string","pattern":"^0x[0-9a-fA-F]+$","description":"The voucher signature from `payerAuthorizer`."},"totalClaimed":{"type":"string","pattern":"^[0-9]+$","description":"The cumulative amount already claimed from this channel as of this claim.","example":"3000000"}},"required":["voucher","signature","totalClaimed"],"example":{"voucher":{"channel":{"payer":"0x857b06519E91e3A54538791bDbb0E22373e36b66","payerAuthorizer":"0x857b06519E91e3A54538791bDbb0E22373e36b66","receiver":"0x209693Bc6afc0C5328bA36FaF03C514EF312287C","receiverAuthorizer":"0x1111111111111111111111111111111111111111","token":"0x036CbD53842c5426634e7929541eC2318f3dCF7e","withdrawDelay":86400,"salt":"0x0000000000000000000000000000000000000000000000000000000000000001"},"maxClaimableAmount":"5000000"},"signature":"0xf3746613c2d920b5fdabc0856f2aeb2d4f88ee6037b8cc5d04a71a4462f134801234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1b","totalClaimed":"3000000"}},"x402BatchSettlementRefundPayload":{"type":"object","title":"x402BatchSettlementRefundPayload","description":"A cooperative refund request. The client emits the minimal shape (just `channelConfig` and `voucher`, with an optional `amount`). A mediating server enriches the payload with `amount`, `refundNonce`, and `claims` before forwarding to the facilitator. Authorizer signatures are optional — the facilitator auto-signs when absent. Field presence determines which shape was sent; the facilitator dispatches accordingly.","properties":{"type":{"type":"string","description":"The payload-type discriminator. Must be `\"refund\"` for both the client-emitted and server-enriched shape.","enum":["refund"]},"channelConfig":{"$ref":"#/components/schemas/x402BatchSettlementChannelConfig"},"voucher":{"$ref":"#/components/schemas/x402BatchSettlementVoucher"},"amount":{"type":"string","pattern":"^[0-9]+$","description":"The refund amount in atomic units of `channelConfig.token`. Optional in the client-emitted shape (defaults to the full remaining channel balance). Required when the payload is enriched by a mediating server.","example":"1000000"},"refundNonce":{"type":"string","pattern":"^[0-9]+$","description":"The on-chain refund nonce for replay protection (uint256 as decimal string). Only present on the server-enriched shape.","example":"1"},"claims":{"type":"array","description":"Voucher claims to include atomically with the refund. Only present on the server-enriched shape.","items":{"$ref":"#/components/schemas/x402BatchSettlementClaim"}},"refundAuthorizerSignature":{"type":"string","pattern":"^0x[0-9a-fA-F]+$","description":"Optional EIP-712 signature from the receiver authorizer over the refund. When omitted, the facilitator auto-signs."},"claimAuthorizerSignature":{"type":"string","pattern":"^0x[0-9a-fA-F]+$","description":"Optional EIP-712 signature from the receiver authorizer over the included claims. When omitted, the facilitator auto-signs."}},"required":["type","channelConfig","voucher"],"example":{"type":"refund","channelConfig":{"payer":"0x857b06519E91e3A54538791bDbb0E22373e36b66","payerAuthorizer":"0x857b06519E91e3A54538791bDbb0E22373e36b66","receiver":"0x209693Bc6afc0C5328bA36FaF03C514EF312287C","receiverAuthorizer":"0x1111111111111111111111111111111111111111","token":"0x036CbD53842c5426634e7929541eC2318f3dCF7e","withdrawDelay":86400,"salt":"0x0000000000000000000000000000000000000000000000000000000000000001"},"voucher":{"channelId":"0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890","maxClaimableAmount":"5000000","signature":"0xf3746613c2d920b5fdabc0856f2aeb2d4f88ee6037b8cc5d04a71a4462f134801234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1b"},"amount":"1000000"}},"x402BatchSettlementClaimPayload":{"type":"object","title":"x402BatchSettlementClaimPayload","description":"Server-to-facilitator request to batch on-chain claims of accumulated vouchers. `claimAuthorizerSignature` is optional; when absent the facilitator auto-signs with its receiver-authorizer key.","properties":{"type":{"type":"string","description":"The payload-type discriminator. Must be `\"claim\"` for a server-to-facilitator on-chain claim batch request.","enum":["claim"]},"claims":{"type":"array","description":"The list of voucher claims to batch in a single on-chain `claim` call.","items":{"$ref":"#/components/schemas/x402BatchSettlementClaim"}},"claimAuthorizerSignature":{"type":"string","pattern":"^0x[0-9a-fA-F]+$","description":"Optional EIP-712 signature from the receiver authorizer over the claim batch. When omitted, the facilitator auto-signs."}},"required":["type","claims"],"example":{"type":"claim","claims":[{"voucher":{"channel":{"payer":"0x857b06519E91e3A54538791bDbb0E22373e36b66","payerAuthorizer":"0x857b06519E91e3A54538791bDbb0E22373e36b66","receiver":"0x209693Bc6afc0C5328bA36FaF03C514EF312287C","receiverAuthorizer":"0x1111111111111111111111111111111111111111","token":"0x036CbD53842c5426634e7929541eC2318f3dCF7e","withdrawDelay":86400,"salt":"0x0000000000000000000000000000000000000000000000000000000000000001"},"maxClaimableAmount":"5000000"},"signature":"0xf3746613c2d920b5fdabc0856f2aeb2d4f88ee6037b8cc5d04a71a4462f134801234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1b","totalClaimed":"3000000"}]}},"x402BatchSettlementSettlePayload":{"type":"object","title":"x402BatchSettlementSettlePayload","description":"Server-to-facilitator request to transfer claimed funds for a `(receiver, token)` pair to the receiver wallet.","properties":{"type":{"type":"string","description":"The payload-type discriminator. Must be `\"settle\"` for a server-to-facilitator request to move claimed funds to the receiver.","enum":["settle"]},"receiver":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"The 0x-prefixed, checksum EVM address of the receiver to settle to.","example":"0x209693Bc6afc0C5328bA36FaF03C514EF312287C"},"token":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"The 0x-prefixed, checksum EVM address of the token to settle.","example":"0x036CbD53842c5426634e7929541eC2318f3dCF7e"}},"required":["type","receiver","token"],"example":{"type":"settle","receiver":"0x209693Bc6afc0C5328bA36FaF03C514EF312287C","token":"0x036CbD53842c5426634e7929541eC2318f3dCF7e"}},"x402BatchSettlementEvmPayload":{"type":"object","title":"x402BatchSettlementEvmPayload","description":"The x402 protocol batch-settlement scheme payload for EVM networks. The `batch-settlement` scheme uses pre-funded payment channels with off-chain cumulative-ceiling vouchers, allowing servers to batch-claim accumulated value in a single on-chain transaction. The payload is a discriminated union on the `type` field with five variants:\n\n  - `deposit`: client-initiated channel funding via ERC-3009.\n  - `voucher`: client-side cumulative voucher against an already-funded channel.\n  - `refund`: cooperative refund request. The client emits a minimal shape (just channelConfig + voucher, with an optional `amount`); a mediating server enriches it with `amount`, `refundNonce`, and `claims` before forwarding to the facilitator. Authorizer signatures are optional — the facilitator auto-signs when absent.\n  - `claim`: server-to-facilitator request to batch on-chain voucher claims.\n  - `settle`: server-to-facilitator request to transfer claimed funds to the receiver.\n\nFor more details, see [batch-settlement specs](https://github.com/x402-foundation/x402/tree/main/specs/schemes/batch-settlement).","oneOf":[{"$ref":"#/components/schemas/x402BatchSettlementDepositPayload"},{"$ref":"#/components/schemas/x402BatchSettlementVoucherPayload"},{"$ref":"#/components/schemas/x402BatchSettlementRefundPayload"},{"$ref":"#/components/schemas/x402BatchSettlementClaimPayload"},{"$ref":"#/components/schemas/x402BatchSettlementSettlePayload"}],"discriminator":{"propertyName":"type","mapping":{"deposit":"#/components/schemas/x402BatchSettlementDepositPayload","voucher":"#/components/schemas/x402BatchSettlementVoucherPayload","refund":"#/components/schemas/x402BatchSettlementRefundPayload","claim":"#/components/schemas/x402BatchSettlementClaimPayload","settle":"#/components/schemas/x402BatchSettlementSettlePayload"}}},"x402V2PaymentPayload":{"type":"object","title":"x402V2PaymentPayload","description":"The x402 v2 protocol payment payload. Uses CAIP-2 network identifiers. The `accepted` field carries the full payment requirements; `scheme` and `network` are not top-level fields (they are on the nested `accepted` object).","properties":{"x402Version":{"allOf":[{"$ref":"#/components/schemas/X402Version"}],"description":"The x402 protocol version. Must be `2` for this payload shape."},"payload":{"type":"object","description":"The payload of the payment depending on the x402Version, scheme, and network. Discriminated by scheme-specific fields: exact-EVM/upto-EVM payloads carry a `signature`; exact-Solana carries a `transaction`; batch-settlement carries a `type` discriminator. See `x402BatchSettlementEvmPayload` for the documented batch-settlement variants.","oneOf":[{"$ref":"#/components/schemas/x402ExactEvmPayload"},{"$ref":"#/components/schemas/x402ExactEvmPermit2Payload"},{"$ref":"#/components/schemas/x402ExactSolanaPayload"},{"$ref":"#/components/schemas/x402UptoEvmPermit2Payload"},{"$ref":"#/components/schemas/x402BatchSettlementEvmPayload"}],"example":{"signature":"0xf3746613c2d920b5fdabc0856f2aeb2d4f88ee6037b8cc5d04a71a4462f134801234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1b","authorization":{"from":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","to":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","value":"1000000000000000000","validAfter":"1716150000","validBefore":"1716150000","nonce":"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"}}},"accepted":{"$ref":"#/components/schemas/x402V2PaymentRequirements"},"resource":{"$ref":"#/components/schemas/x402ResourceInfo"},"extensions":{"type":"object","description":"Optional protocol extensions.","additionalProperties":true,"example":{"bazaar":{"info":{"input":{"type":"http","method":"GET"}},"schema":{}}}}},"example":{"x402Version":2,"accepted":{"scheme":"exact","network":"eip155:84532","asset":"0x036CbD53842c5426634e7929541eC2318f3dCF7e","amount":"1000","payTo":"0x122F8Fcaf2152420445Aa424E1D8C0306935B5c9","maxTimeoutSeconds":60,"extra":{"name":"USDC","version":"2"}},"payload":{"signature":"0xf3746613c2d920b5fdabc0856f2aeb2d4f88ee6037b8cc5d04a71a4462f134801234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1b","authorization":{"from":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","to":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","value":"1000000000000000000","validAfter":"1716150000","validBefore":"1716150000","nonce":"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"}},"resource":{"url":"https://api.example.com/premium/resource/123","description":"Premium API access for data analysis.","mimeType":"application/json"}},"required":["x402Version","accepted","payload"]},"x402V1PaymentPayload":{"type":"object","title":"x402V1PaymentPayload","description":"The x402 v1 protocol payment payload. Uses human-readable network names and requires `scheme` and `network` alongside the inner `payload` object.","properties":{"x402Version":{"allOf":[{"$ref":"#/components/schemas/X402Version"}],"description":"The x402 protocol version. Must be `1` for this payload shape."},"scheme":{"type":"string","description":"The scheme of the payment protocol to use. Currently, the only supported scheme is `exact`.","enum":["exact"],"example":"exact"},"network":{"allOf":[{"$ref":"#/components/schemas/X402V1Network"}],"description":"The network of the blockchain to send payment on.","example":"base"},"payload":{"type":"object","description":"The payload of the payment depending on the x402Version, scheme, and network.","oneOf":[{"$ref":"#/components/schemas/x402ExactEvmPayload"},{"$ref":"#/components/schemas/x402ExactEvmPermit2Payload"},{"$ref":"#/components/schemas/x402ExactSolanaPayload"}],"example":{"signature":"0xf3746613c2d920b5fdabc0856f2aeb2d4f88ee6037b8cc5d04a71a4462f134801234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1b","authorization":{"from":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","to":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","value":"1000000000000000000","validAfter":"1716150000","validBefore":"1716150000","nonce":"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"}}}},"example":{"x402Version":1,"scheme":"exact","network":"base","payload":{"signature":"0xf3746613c2d920b5fdabc0856f2aeb2d4f88ee6037b8cc5d04a71a4462f134801234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1b","authorization":{"from":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","to":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","value":"1000000000000000000","validAfter":"1716150000","validBefore":"1716150000","nonce":"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"}}},"required":["x402Version","scheme","network","payload"]},"x402PaymentPayload":{"type":"object","description":"The x402 protocol payment payload that the client attaches to x402-paid API requests to the resource server in the PAYMENT-SIGNATURE header.\nFor EVM networks, smart account signatures can be longer than 65 bytes.","oneOf":[{"$ref":"#/components/schemas/x402V2PaymentPayload"},{"$ref":"#/components/schemas/x402V1PaymentPayload"}]},"EvmAccount":{"type":"object","properties":{"address":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"The 0x-prefixed, checksum EVM address.","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"},"name":{"type":"string","description":"An optional name for the account.\nAccount names can consist of alphanumeric characters and hyphens, and be between 2 and 36 characters long.\nAccount names are guaranteed to be unique across all EVM accounts in the developer's CDP Project.","example":"my-account","pattern":"^[A-Za-z0-9][A-Za-z0-9-]{0,34}[A-Za-z0-9]$"},"policies":{"type":"array","x-audience":"public","description":"The list of policy IDs that apply to the account. This will include both the project-level policy and the account-level policy, if one exists.","items":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"example":["123e4567-e89b-12d3-a456-426614174000"]},"createdAt":{"type":"string","description":"The UTC ISO 8601 timestamp at which the account was created.","example":"2025-03-25T12:00:00Z","format":"date-time"},"updatedAt":{"type":"string","description":"The UTC ISO 8601 timestamp at which the account was last updated.","example":"2025-03-26T12:00:00Z","format":"date-time"}},"required":["address"]},"EvmEip7702DelegationOperation":{"type":"object","description":"The status of an EIP-7702 delegation operation.","properties":{"delegationOperationId":{"type":"string","format":"uuid","description":"The unique identifier for the delegation operation.","example":"a1b2c3d4-e5f6-7890-abcd-ef1234567890"},"status":{"type":"string","description":"The current status of the delegation operation.\nUNSPECIFIED means the status has not been set. PENDING means the operation has been created but not yet submitted. SUBMITTED means the operation has been submitted to the network. COMPLETED means the operation has completed successfully. FAILED means the operation has failed.","enum":["UNSPECIFIED","PENDING","SUBMITTED","COMPLETED","FAILED"],"example":"COMPLETED"},"transactionHash":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$","description":"The hash of the delegation transaction, if available. Present once the transaction has been submitted to the network.","example":"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"},"network":{"$ref":"#/components/schemas/EvmEip7702DelegationNetwork"},"delegateAddress":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"The address the account has delegated to, if any. Only present when the account has an active delegation.","example":"0x7702cb554e6bFb442cb743A7dF23154544a7176C"}},"required":["delegationOperationId","status","network"]},"EvmSmartAccount":{"type":"object","properties":{"address":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"The 0x-prefixed, checksum address of the Smart Account.","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"},"owners":{"type":"array","items":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"description":"Today, only a single owner can be set for a Smart Account, but this is an array to allow having multiple owners in the future. The address is a 0x-prefixed, checksum address.","example":["0xfc807D1bE4997e5C7B33E4d8D57e60c5b0f02B1a"]},"name":{"type":"string","description":"An optional name for the account.\nAccount names can consist of alphanumeric characters and hyphens, and be between 2 and 36 characters long.\nAccount names are guaranteed to be unique across all Smart Accounts in the developer's CDP Project.","example":"my-smart-account","pattern":"^[A-Za-z0-9][A-Za-z0-9-]{0,34}[A-Za-z0-9]$"},"policies":{"type":"array","x-audience":"public","description":"The list of policy IDs that apply to the smart account. This will include both the project-level policy and the account-level policy, if one exists.","items":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"example":["123e4567-e89b-12d3-a456-426614174000"]},"createdAt":{"type":"string","description":"The UTC ISO 8601 timestamp at which the account was created.","example":"2025-03-25T12:00:00Z","format":"date-time"},"updatedAt":{"type":"string","description":"The UTC ISO 8601 timestamp at which the account was last updated.","example":"2025-03-26T12:00:00Z","format":"date-time"}},"required":["address","owners"]},"SpendPermissionNetwork":{"type":"string","description":"The network the spend permission is on.","enum":["base","base-sepolia","ethereum","ethereum-sepolia","optimism","arbitrum","avalanche","polygon"],"example":"base"},"CreateSpendPermissionRequest":{"type":"object","description":"Request parameters for creating a Spend Permission.","properties":{"network":{"$ref":"#/components/schemas/SpendPermissionNetwork"},"spender":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$","description":"Entity that can spend account's tokens. Can be either a Smart Account or an EOA.","example":"0x9Fb909eA400c2b8D99Be292DADf07e63B814527c"},"token":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$","description":"ERC-7528 native token address (e.g. \"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE\" for native ETH), or an  ERC-20 contract address.","example":"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"},"allowance":{"type":"string","description":"Maximum allowed value to spend, in atomic units for the specified token, within each period.","example":"1000000000000000000"},"period":{"type":"string","description":"Time duration for resetting used allowance on a recurring basis (seconds).","example":"86400"},"start":{"type":"string","description":"The start time for this spend permission, in Unix seconds.","example":"0"},"end":{"type":"string","description":"The expiration time for this spend permission, in Unix seconds.","example":"281474976710655"},"salt":{"type":"string","description":"An arbitrary salt to differentiate unique spend permissions with otherwise identical data.","example":"95959551014433038874972658238091428449162862973207257628575040053304171156143"},"extraData":{"type":"string","description":"Arbitrary data to include in the permission.","example":"0x"},"paymasterUrl":{"allOf":[{"$ref":"#/components/schemas/Url"}],"description":"The paymaster URL of the spend permission.","example":"https://paymaster.cdp.coinbase.com"}},"required":["network","spender","token","allowance","period","start","end"]},"SpendPermission":{"type":"object","description":"The core spend permission.","example":{"account":"0xd53Ee96438383Bb1eff07958D110B81363E9Ab47","spender":"0x9Fb909eA400c2b8D99Be292DADf07e63B814527c","token":"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE","allowance":"1000000000000000000","period":"86400","start":"0","end":"281474976710655","salt":"0","extraData":"0x"},"properties":{"account":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$","description":"Smart account this spend permission is valid for.","example":"0xd53Ee96438383Bb1eff07958D110B81363E9Ab47"},"spender":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$","description":"Entity that can spend account's tokens.","example":"0x9Fb909eA400c2b8D99Be292DADf07e63B814527c"},"token":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$","description":"Token address (ERC-7528 native token address or ERC-20 contract).","example":"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"},"allowance":{"type":"string","description":"Maximum allowed value to spend, in atomic units for the specified token, within each period.","example":"1000000000000000000"},"period":{"type":"string","description":"Time duration for resetting used allowance on a recurring basis (seconds).","example":"86400"},"start":{"type":"string","description":"The start time for this spend permission, in Unix seconds.","example":"0"},"end":{"type":"string","description":"The expiration time for this spend permission, in Unix seconds.","example":"281474976710655"},"salt":{"type":"string","description":"An arbitrary salt to differentiate unique spend permissions with otherwise identical data.","example":"0"},"extraData":{"type":"string","description":"Arbitrary data to include in the permission.","example":"0x"}},"required":["account","spender","token","allowance","period","start","end","salt","extraData"]},"SpendPermissionResponseObject":{"type":"object","properties":{"permission":{"$ref":"#/components/schemas/SpendPermission"},"permissionHash":{"type":"string","description":"Unique hash identifier for this permission.","example":"0x62bc94756bb6221a7913beab6024171fc60d3380fdc06759bfac76e8ccb3f63d"},"revoked":{"type":"boolean","description":"Whether this permission has been revoked.","example":false},"revokedAt":{"type":"string","description":"The UTC ISO 8601 timestamp when the permission was revoked (if applicable).","example":"2025-03-25T12:00:00Z","format":"date-time"},"createdAt":{"type":"string","description":"The UTC ISO 8601 timestamp when the permission was created.","example":"2025-03-25T12:00:00Z","format":"date-time"},"network":{"$ref":"#/components/schemas/SpendPermissionNetwork"}},"required":["permission","permissionHash","revoked","createdAt","network"]},"RevokeSpendPermissionRequest":{"type":"object","description":"Request parameters for revoking a Spend Permission.","properties":{"network":{"$ref":"#/components/schemas/SpendPermissionNetwork"},"permissionHash":{"type":"string","description":"The hash of the spend permission to revoke.","example":"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"},"paymasterUrl":{"allOf":[{"$ref":"#/components/schemas/Url"}],"description":"The paymaster URL of the spend permission.","example":"https://paymaster.cdp.coinbase.com"}},"required":["network","permissionHash"]},"EvmSwapsNetwork":{"type":"string","enum":["base","ethereum","arbitrum","optimism","polygon"],"description":"The network on which to perform the swap.","example":"base"},"toToken":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$","description":"The 0x-prefixed contract address of the token to receive.","example":"0x7F5c764cBc14f9669B88837ca1490cCa17c31607"},"fromToken":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$","description":"The 0x-prefixed contract address of the token to send.","example":"0x6B175474E89094C44Da98b954EedeAC495271d0F"},"fromAmount":{"type":"string","pattern":"^\\d+$","description":"The amount of the `fromToken` to send in atomic units of the token. For example, `1000000000000000000` when sending ETH equates to 1 ETH, `1000000` when sending USDC equates to 1 USDC, etc.","example":"1000000000000000000"},"taker":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$","description":"The 0x-prefixed address that holds the `fromToken` balance and has the `Permit2` allowance set for the swap.","example":"0xAc0974bec39a17e36ba4a6b4d238ff944bacb478"},"signerAddress":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$","description":"The 0x-prefixed Externally Owned Account (EOA) address that will sign the `Permit2` EIP-712 permit message. This is only needed if `taker` is a smart contract.","example":"0x922f49447d8a07e3bd95bd0d56f35241523fbab8"},"gasPrice":{"type":"string","pattern":"^\\d+$","description":"The target gas price for the swap transaction, in Wei. For EIP-1559 transactions, this value should be seen as the `maxFeePerGas` value. If not provided, the API will use an estimate based on the current network conditions.","example":"1000000000"},"slippageBps":{"type":"integer","minimum":0,"maximum":10000,"description":"The maximum acceptable slippage of the `toToken` in basis points. If this parameter is set to 0, no slippage will be tolerated. If not provided, the default slippage tolerance is 100 bps (i.e., 1%).","default":100,"example":100},"TokenFee":{"type":"object","properties":{"amount":{"type":"string","pattern":"^\\d+$","description":"The estimated amount of the fee in atomic units of the `token`. For example, `1000000000000000` if the fee is in ETH equates to 0.001 ETH, `10000` if the fee is in USDC equates to 0.01 USDC, etc.","example":"1000000000000000000"},"token":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$","description":"The contract address of the token that the fee is paid in. The address `0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE` is used for the native token of the network (e.g. ETH).","example":"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"}},"required":["amount","token"]},"CommonSwapResponse":{"type":"object","properties":{"blockNumber":{"type":"string","pattern":"^[1-9]\\d*$","description":"The block number at which the liquidity conditions were examined.","example":"17038723"},"toAmount":{"type":"string","pattern":"^(0|[1-9]\\d*)$","description":"The amount of the `toToken` that will be received in atomic units of the `toToken`. For example, `1000000000000000000` when receiving ETH equates to 1 ETH, `1000000` when receiving USDC equates to 1 USDC, etc.","example":"1000000000000000000"},"toToken":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$","description":"The 0x-prefixed contract address of the token that will be received.","example":"0x7F5c764cBc14f9669B88837ca1490cCa17c31607"},"fees":{"type":"object","description":"The estimated fees for the swap.","properties":{"gasFee":{"type":"object","nullable":true,"description":"The estimated gas fee for the swap.","allOf":[{"$ref":"#/components/schemas/TokenFee"}]},"protocolFee":{"type":"object","nullable":true,"description":"The estimated protocol fee for the swap.","allOf":[{"$ref":"#/components/schemas/TokenFee"}]}},"required":["gasFee","protocolFee"],"example":{"gasFee":{"amount":"1000000000000000000","token":"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"},"protocolFee":{"amount":"1000000000000000000","token":"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"}}},"issues":{"type":"object","description":"An object containing potential issues discovered during validation that could prevent the swap from being executed successfully.","properties":{"allowance":{"type":"object","nullable":true,"description":"Details of the allowances that the taker must set in order to execute the swap successfully. Null if no allowance is required.","properties":{"currentAllowance":{"type":"string","pattern":"^\\d+$","description":"The current allowance of the `fromToken` by the `taker`.","example":"1000000000"},"spender":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$","description":"The 0x-prefixed address of to set the allowance on.","example":"0x000000000022D473030F116dDEE9F6B43aC78BA3"}},"required":["currentAllowance","spender"],"example":{"currentAllowance":"1000000000","spender":"0x000000000022D473030F116dDEE9F6B43aC78BA3"}},"balance":{"type":"object","nullable":true,"description":"Details of the balance of the `fromToken` that the `taker` must hold. Null if the `taker` has a sufficient balance.","properties":{"token":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$","description":"The 0x-prefixed contract address of the token."},"currentBalance":{"type":"string","pattern":"^\\d+$","description":"The current balance of the `fromToken` by the `taker`.","example":"10000000"},"requiredBalance":{"type":"string","pattern":"^\\d+$","description":"The amount of the token that the `taker` must hold.","example":"1000000000000000000"}},"required":["token","currentBalance","requiredBalance"],"example":{"token":"0x6B175474E89094C44Da98b954EedeAC495271d0F","currentBalance":"1000000000000000000","requiredBalance":"1000000000000000000"}},"simulationIncomplete":{"type":"boolean","description":"This is set to true when the transaction cannot be validated. This can happen when the taker has an insufficient balance of the `fromToken`. Note that this does not necessarily mean that the trade will revert.","example":false}},"required":["allowance","balance","simulationIncomplete"],"example":{"allowance":{"currentAllowance":"1000000000","spender":"0x000000000022D473030F116dDEE9F6B43aC78BA3"},"balance":{"token":"0x6B175474E89094C44Da98b954EedeAC495271d0F","currentBalance":"900000000000000000","requiredBalance":"1000000000000000000"},"simulationIncomplete":false}},"liquidityAvailable":{"type":"boolean","enum":[true],"description":"Whether sufficient liquidity is available to settle the swap. All other fields in the response will be empty if this is false.","example":true},"minToAmount":{"type":"string","pattern":"^(0|[1-9]\\d*)$","description":"The minimum amount of the `toToken` that must be received for the swap to succeed, in atomic units of the `toToken`.  For example, `1000000000000000000` when receiving ETH equates to 1 ETH, `1000000` when receiving USDC equates to 1 USDC, etc. This value is influenced by the `slippageBps` parameter.","example":"900000000000000000"},"fromAmount":{"type":"string","pattern":"^(0|[1-9]\\d*)$","description":"The amount of the `fromToken` that will be sent in this swap, in atomic units of the `fromToken`. For example, `1000000000000000000` when sending ETH equates to 1 ETH, `1000000` when sending USDC equates to 1 USDC, etc.","example":"1000000000000000000"},"fromToken":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$","description":"The 0x-prefixed contract address of the token that will be sent.","example":"0x6B175474E89094C44Da98b954EedeAC495271d0F"}},"required":["blockNumber","toAmount","toToken","fees","issues","liquidityAvailable","minToAmount","fromAmount","fromToken"],"example":{"blockNumber":"17038723","toAmount":"1000000000000000000","toToken":"0x7F5c764cBc14f9669B88837ca1490cCa17c31607","fees":{"gasFee":{"amount":"1000000000000000000","token":"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"},"protocolFee":{"amount":"1000000000000000000","token":"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"}},"issues":{"allowance":{"currentAllowance":"1000000000","spender":"0x000000000022D473030F116dDEE9F6B43aC78BA3"},"balance":{"token":"0x6B175474E89094C44Da98b954EedeAC495271d0F","currentBalance":"1000000000000000000","requiredBalance":"1000000000000000000"},"simulationIncomplete":false},"liquidityAvailable":true,"minToAmount":"900000000000000000","fromAmount":"1000000000000000000","fromToken":"0x6B175474E89094C44Da98b954EedeAC495271d0F"}},"GetSwapPriceResponse":{"title":"GetSwapPriceResponse","allOf":[{"$ref":"#/components/schemas/CommonSwapResponse"},{"type":"object","properties":{"gas":{"type":"string","nullable":true,"pattern":"^\\d+$","description":"The estimated gas limit that should be used to send the transaction to guarantee settlement.","example":"100000"},"gasPrice":{"type":"string","pattern":"^\\d+$","description":"The gas price, in Wei, that should be used to send the transaction. For EIP-1559 transactions, this value should be seen as the `maxFeePerGas` value. The transaction should be sent with this gas price to guarantee settlement.","example":"1000000000"}},"required":["gas","gasPrice"]}]},"SwapUnavailableResponse":{"type":"object","title":"SwapUnavailableResponse","properties":{"liquidityAvailable":{"type":"boolean","enum":[false],"description":"Whether sufficient liquidity is available to settle the swap. All other fields in the response will be empty if this is false.","example":false}},"required":["liquidityAvailable"],"example":{"liquidityAvailable":false}},"GetSwapPriceResponseWrapper":{"description":"A wrapper for the response of a swap price operation.","oneOf":[{"$ref":"#/components/schemas/GetSwapPriceResponse"},{"$ref":"#/components/schemas/SwapUnavailableResponse"}]},"CreateSwapQuoteResponse":{"title":"CreateSwapQuoteResponse","allOf":[{"type":"object","properties":{"permit2":{"type":"object","nullable":true,"description":"The approval object which contains the necessary fields to submit an approval for this transaction. Null if the `fromToken` is the native token or the transaction is a native token wrap / unwrap.","properties":{"hash":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$","description":"The hash for the approval according to [EIP-712](https://eips.ethereum.org/EIPS/eip-712). Computing the hash of the `eip712` field should match the value of this field.","example":"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"},"eip712":{"$ref":"#/components/schemas/EIP712Message"}},"required":["hash","eip712"]},"transaction":{"type":"object","description":"The details of the transaction to be signed and submitted to execute the swap.","properties":{"to":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$","description":"The 0x-prefixed address of the contract to call.","example":"0x000000000022D473030F116dDEE9F6B43aC78BA3"},"data":{"type":"string","description":"The hex-encoded call data to send to the contract.","example":"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"},"gas":{"type":"string","pattern":"^\\d+$","description":"The estimated gas limit that should be used to send the transaction to guarantee settlement.","example":"100000"},"gasPrice":{"type":"string","pattern":"^\\d+$","description":"The gas price, in Wei, that should be used to send the transaction. For EIP-1559 transactions, this value should be seen as the `maxFeePerGas` value. The transaction should be sent with this gas price to guarantee settlement.","example":"1000000000"},"value":{"type":"string","pattern":"^\\d+$","description":"The value of the transaction in Wei.","example":"1000000000000000000"}},"required":["to","data","gas","gasPrice","value"]}},"required":["permit2","transaction"]},{"$ref":"#/components/schemas/CommonSwapResponse"}]},"CreateSwapQuoteResponseWrapper":{"description":"A wrapper for the response of a swap quote operation.","oneOf":[{"$ref":"#/components/schemas/CreateSwapQuoteResponse"},{"$ref":"#/components/schemas/SwapUnavailableResponse"}]},"ListEvmTokenBalancesNetwork":{"type":"string","enum":["base","base-sepolia","ethereum"],"description":"The name of the supported EVM networks in human-readable format.","example":"base"},"TokenAmount":{"type":"object","description":"Amount of a given token.","example":{"amount":"125000000000000000000","decimals":18},"properties":{"amount":{"type":"string","pattern":"^[0-9]+$","description":"The amount is denominated in the smallest indivisible unit of the token. For ETH, the smallest indivisible unit is Wei (10^-18 ETH). For ERC-20s, the smallest unit is the unit returned from `function totalSupply() public view returns (uint256)`.","example":"1250000000000000000"},"decimals":{"type":"integer","format":"int64","description":"'decimals' is the exponential value N that satisfies the equation `amount * 10^-N = standard_denomination`. The standard denomination is the most commonly used denomination for the token.\n- In the case of the native gas token, `decimals` is defined via convention. As an example, for ETH of Ethereum mainnet, the standard denomination is 10^-18 the smallest denomination (Wei). As such, for ETH on Ethereum mainnet, `decimals` is 18. - In the case of ERC-20 tokens, `decimals` is defined via configuration. `decimals` will be the number returned by `function decimals() public view returns (uint8)` on the underlying token contract.\nNot all tokens have a `decimals` field, as this function is [optional in the ERC-20 specification](https://eips.ethereum.org/EIPS/eip-20#decimals). This field will be left empty if the underlying token contract doesn't implement `decimals`.\nFurther, this endpoint will only populate this value for a small subset of whitelisted ERC-20 tokens at this time. We intend to improve coverage in the future.","example":18}},"required":["amount","decimals"]},"Token":{"type":"object","description":"General information about a token. Includes the type, the network, and other identifying information.","example":{"network":"base","symbol":"ETH","name":"Ether","contractAddress":"0x1234567890123456789012345678901234567890"},"properties":{"network":{"$ref":"#/components/schemas/ListEvmTokenBalancesNetwork"},"symbol":{"type":"string","description":"The symbol of this token (ex: SOL, ETH, USDC).\nThe token symbol is not unique. It is possible for two different tokens to have the same symbol.\nFor native gas tokens, this symbol is defined via convention. As an example, for ETH on Ethereum mainnet, the symbol is \"ETH\". For ERC-20 tokens, this symbol is defined via configuration. `symbol` will be the string returned by `function symbol() public view returns (string)` on the underlying token contract.\nNot all tokens have a symbol, as this function is [optional in the ERC-20 specification](https://eips.ethereum.org/EIPS/eip-20#symbol). This field will only be populated when the token's underlying ERC-20 contract has a `symbol()` function.\nFurther, this endpoint will only populate this value for a small subset of whitelisted ERC-20 tokens at this time. We intend to improve coverage in the future.","example":"ETH"},"name":{"type":"string","description":"The name of this token (ex: \"Solana\", \"Ether\", \"USD Coin\").\nThe token name is not unique. It is possible for two different tokens to have the same name.\nFor native gas tokens, this name is defined via convention. As an example, for ETH on Ethereum mainnet, the name is \"Ether\". For ERC-20 tokens, this name is defined via configuration. `name` will be the string returned by `function name() public view returns (string)` on the underlying token contract.\nNot all tokens have a name, as this function is [optional in the ERC-20 specification](https://eips.ethereum.org/EIPS/eip-20#name). This field will only be populated when the token's underlying ERC-20 contract has a `name()` function.\nFurther, this endpoint will only populate this value for a small subset of whitelisted ERC-20 tokens at this time. We intend to improve coverage in the future.","example":"Ether"},"contractAddress":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"The contract address of the token.\nFor Ether, the contract address is `0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE` per [EIP-7528](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-7528.md). For ERC-20 tokens, this is the contract address where the token is deployed.","example":"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"}},"required":["network","contractAddress"]},"TokenBalance":{"type":"object","properties":{"amount":{"$ref":"#/components/schemas/TokenAmount"},"token":{"$ref":"#/components/schemas/Token"}},"required":["amount","token"]},"EthValueCriterion":{"type":"object","title":"EthValueCriterion","description":"A schema for specifying a criterion for the `value` field of an EVM transaction.","properties":{"type":{"type":"string","description":"The type of criterion to use. This should be `ethValue`.","example":"ethValue","enum":["ethValue"]},"ethValue":{"type":"string","pattern":"^[0-9]+$","maxLength":78,"description":"The amount of ETH, in wei, that the transaction's `value` field should be compared to.","example":"1000000000000000000"},"operator":{"type":"string","description":"The operator to use for the comparison. The transaction's `value` field will be on the left-hand side of the operator, and the `ethValue` field will be on the right-hand side.","enum":[">",">=","<","<=","=="],"example":"<="}},"required":["type","ethValue","operator"]},"EvmAddressCriterion":{"type":"object","x-audience":"public","title":"EvmAddressCriterion","description":"A schema for specifying a criterion for the `to` field of an EVM transaction.","properties":{"type":{"type":"string","description":"The type of criterion to use. This should be `evmAddress`.","example":"evmAddress","enum":["evmAddress"]},"addresses":{"type":"array","description":"A list of 0x-prefixed EVM addresses that the transaction's `to` field should be compared to. There is a limit of 300 addresses per criterion.","items":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"The 0x-prefixed EVM address that the transaction's `to` field should be compared to."},"example":["0x742d35Cc6634C0532925a3b844Bc454e4438f44e","0x1234567890123456789012345678901234567890"]},"operator":{"type":"string","description":"The operator to use for the comparison. The transaction's `to` field will be on the left-hand side of the operator, and the `addresses` field will be on the right-hand side.","enum":["in","not in"],"example":"in"}},"required":["type","addresses","operator"]},"KnownAbiType":{"type":"string","title":"KnownAbiType","description":"A reference to an established EIP standard. When referencing a `KnownAbiType` within a policy rule configuring an `EvmDataCriterion`, criteria will only decode function data officially documented in the standard. For more information on supported token standards, see the links below.\n  - [erc20 - Token Standard](https://eips.ethereum.org/EIPS/eip-20).\n  - [erc721 - Non-Fungible Token Standard](https://eips.ethereum.org/EIPS/eip-721).\n  - [erc1155 - Multi Token Standard](https://eips.ethereum.org/EIPS/eip-1155).","enum":["erc20","erc721","erc1155"]},"AbiParameter":{"x-audience":"public","type":"object","description":"Parameter definition for ABI functions, errors, and constructors.","required":["type"],"properties":{"name":{"type":"string","description":"The name of the parameter.","example":"tokenId"},"type":{"type":"string","description":"The canonical type of the parameter.","example":"uint256"},"internalType":{"type":"string","description":"The internal Solidity type used by the compiler.","example":"uint256"},"components":{"type":"array","description":"Used for tuple types.","items":{"$ref":"#/components/schemas/AbiParameter"},"example":[{"name":"x","type":"uint256"}]}},"example":{"name":"tokenId","type":"uint256","internalType":"uint256"}},"AbiStateMutability":{"x-audience":"public","type":"string","description":"State mutability of a function in Solidity.","enum":["pure","view","nonpayable","payable"],"example":"view"},"AbiFunction":{"x-audience":"public","type":"object","title":"AbiFunction","description":"ABI function type for contract functions.","required":["type","name","inputs","outputs","stateMutability"],"properties":{"type":{"description":"The type of the ABI item, must be `function`.","type":"string","enum":["function"],"example":"function"},"name":{"type":"string","description":"The name of the ABI function.","example":"approve"},"inputs":{"type":"array","description":"The list of ABI parameters used for this function.","items":{"$ref":"#/components/schemas/AbiParameter"},"example":[{"name":"spender","type":"address","internalType":"address"}]},"outputs":{"type":"array","description":"The values returned by this function.","items":{"$ref":"#/components/schemas/AbiParameter"},"example":{"name":"","type":"bool","internalType":"bool"}},"constant":{"type":"boolean","description":"Deprecated. Use pure or view from stateMutability instead.","example":false},"payable":{"type":"boolean","description":"Deprecated. Use payable or nonpayable from `stateMutability` instead.","example":false},"stateMutability":{"$ref":"#/components/schemas/AbiStateMutability"},"gas":{"type":"integer","description":"Deprecated. Vyper used to provide gas estimates.","example":0}},"example":{"type":"function","name":"balanceOf","inputs":[{"name":"owner","type":"address","internalType":"address"}],"outputs":[{"name":null,"type":"uint256","internalType":"uint256"}],"stateMutability":"view"}},"AbiInput":{"x-audience":"public","type":"object","title":"AbiInput","description":"Generic ABI item type encapsulating all other types besides `function`.","required":["type"],"properties":{"type":{"description":"The type of the ABI item.","type":"string","enum":["constructor","error","event","fallback","receive"],"example":"constructor"},"additionalProperties":{"description":"For additional information on the ABI JSON specification, see [the Solidity documentation](https://docs.soliditylang.org/en/latest/abi-spec.html#json).","example":{"type":"error","name":"ERC20InvalidSpender","inputs":[{"name":"spender","type":"address","internalType":"address"}]}}}},"Abi":{"x-audience":"public","type":"array","description":"Contract ABI Specification following Solidity's external JSON interface format.","items":{"oneOf":[{"$ref":"#/components/schemas/AbiFunction"},{"$ref":"#/components/schemas/AbiInput"}]},"example":[{"type":"function","name":"approve","inputs":[{"name":"spender","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":null,"type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"type":"event","name":"Transfer","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"ERC20InvalidSpender","inputs":[{"name":"spender","type":"address","internalType":"address"}]}]},"EvmDataParameterCondition":{"x-audience":"public","type":"object","title":"EvmDataParameterCondition","properties":{"name":{"type":"string","example":"to","description":"The name of the parameter to check against a transaction's calldata. If name is unknown, or is not named, you may supply an array index, e.g., `0` for first parameter."},"operator":{"type":"string","enum":[">",">=","<","<=","=="],"description":"The operator to use for the comparison. The value resolved at the `name` will be on the left-hand side of the operator, and the `value` field will be on the right-hand side.","example":"=="},"value":{"type":"string","example":"100000","description":"A single value to compare the value resolved at `name` to. All values are encoded as strings. Refer to the table in the documentation for how values should be encoded, and which operators are supported for each type."}},"required":["name","operator","value"]},"EvmDataParameterConditionList":{"x-audience":"public","type":"object","title":"EvmDataParameterConditionList","properties":{"name":{"type":"string","example":"to","description":"The name of the parameter to check against a transaction's calldata. If name is unknown, or is not named, you may supply an array index, e.g., `0` for first parameter."},"operator":{"type":"string","enum":["in","not in"],"description":"The operator to use for the comparison. The value resolved at the `name` will be on the left-hand side of the operator, and the `values` field will be on the right-hand side.","example":"in"},"values":{"type":"array","items":{"type":"string","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","description":"A single potential value to compare against the resolved `name` value. All values are encoded as strings. Refer to the table in the documentation for how values should be encoded, and which operators are supported for each type."},"description":"Values to compare against the resolved `name` value. All values are encoded as strings. Refer to the table in the documentation for how values should be encoded, and which operators are supported for each type.","example":["0x742d35Cc6634C0532925a3b844Bc454e4438f44e"]}},"required":["name","operator","values"]},"EvmDataCondition":{"type":"object","x-audience":"public","description":"A single condition to apply against the function and encoded arguments in the transaction's `data` field. Each `parameter` configuration must be successfully evaluated against the corresponding function argument in order for a policy to be accepted.","properties":{"function":{"type":"string","example":"transfer","description":"The name of a smart contract function being called."},"params":{"type":"array","description":"An optional list of parameter conditions to apply against encoded arguments in the transaction's `data` field.","items":{"description":"A list of parameter conditions to apply against encoded arguments in the transaction's `data` field.","oneOf":[{"$ref":"#/components/schemas/EvmDataParameterCondition"},{"$ref":"#/components/schemas/EvmDataParameterConditionList"}]},"example":[{"name":"value","operator":"<=","value":"10000"},{"name":"to","operator":"in","values":["0x742d35Cc6634C0532925a3b844Bc454e4438f44e"]}]}},"example":{"function":"transfer","params":[{"name":"value","operator":"<=","value":"10000"},{"name":"to","operator":"in","values":["0x742d35Cc6634C0532925a3b844Bc454e4438f44e"]}]},"required":["function"]},"EvmDataCriterion":{"type":"object","x-audience":"public","title":"EvmDataCriterion","description":"A schema for specifying a criterion for the `data` field of an EVM transaction.","properties":{"type":{"type":"string","description":"The type of criterion to use. This should be `evmData`.","example":"evmData","enum":["evmData"]},"abi":{"description":"The ABI of the smart contract being called. This can be a partial structure with only specific functions.","oneOf":[{"$ref":"#/components/schemas/KnownAbiType"},{"$ref":"#/components/schemas/Abi"}],"example":"erc20"},"conditions":{"type":"array","description":"A list of conditions to apply against the function and encoded arguments in the transaction's `data` field. Each condition must be met in order for this policy to be accepted or rejected.","items":{"$ref":"#/components/schemas/EvmDataCondition"},"example":[{"function":"approve"},{"function":"transfer","params":[{"name":"value","operator":"<=","value":"10000"},{"name":"to","operator":"in","values":["0x742d35Cc6634C0532925a3b844Bc454e4438f44e"]}]}]}},"required":["type","abi","conditions"]},"NetUSDChangeCriterion":{"type":"object","title":"NetUSDChangeCriterion","description":"A schema for specifying a criterion for the USD denominated asset transfer or exposure for a transaction. This includes native transfers, as well as token transfers.","properties":{"type":{"type":"string","description":"The type of criterion to use. This should be `netUSDChange`.","example":"netUSDChange","enum":["netUSDChange"]},"changeCents":{"type":"integer","description":"The amount of USD, in cents, that the total value of a transaction's asset transfer should be compared to.","example":10000},"operator":{"type":"string","description":"The operator to use for the comparison. The total value of a transaction's asset transfer will be on the left-hand side of the operator, and the `changeCents` field will be on the right-hand side.","enum":[">",">=","<","<=","=="],"example":"<="}},"required":["type","changeCents","operator"]},"SignEvmTransactionCriteria":{"type":"array","description":"A schema for specifying criteria for the SignEvmTransaction operation.","items":{"oneOf":[{"$ref":"#/components/schemas/EthValueCriterion"},{"$ref":"#/components/schemas/EvmAddressCriterion"},{"$ref":"#/components/schemas/EvmDataCriterion"},{"$ref":"#/components/schemas/NetUSDChangeCriterion"}]},"example":[{"type":"ethValue","ethValue":"1000000","operator":">="},{"type":"evmAddress","addresses":["0x742d35Cc6634C0532925a3b844Bc454e4438f44e"],"operator":"in"}]},"SignEvmTransactionRule":{"title":"SignEvmTransactionRule","properties":{"action":{"type":"string","description":"Whether matching the rule will cause the request to be rejected or accepted.","example":"accept","enum":["reject","accept"]},"operation":{"type":"string","description":"The operation to which the rule applies. Every element of the `criteria` array must match the specified operation.","example":"signEvmTransaction","enum":["signEvmTransaction"]},"criteria":{"$ref":"#/components/schemas/SignEvmTransactionCriteria"}},"required":["action","operation","criteria"]},"EvmNetworkCriterion":{"type":"object","x-audience":"public","title":"EvmNetworkCriterion","description":"A schema for specifying a criterion for the intended `network` of an EVM transaction.","properties":{"type":{"type":"string","description":"The type of criterion to use. This should be `evmNetwork`.","example":"evmNetwork","enum":["evmNetwork"]},"networks":{"type":"array","description":"A list of EVM network identifiers that the transaction's intended `network` should be compared to.","items":{"type":"string","description":"The network the transaction is for.","enum":["base-sepolia","base","ethereum","ethereum-sepolia","avalanche","polygon","optimism","arbitrum","arbitrum-sepolia","zora","bnb","world","world-sepolia"],"example":"base-sepolia"},"example":["base","ethereum"]},"operator":{"type":"string","description":"The operator to use for the comparison. The transaction's intended `network` will be on the left-hand side of the operator, and the `networks` field will be on the right-hand side.","enum":["in","not in"],"example":"in"}},"required":["type","networks","operator"]},"SendEvmTransactionCriteria":{"x-audience":"public","type":"array","description":"A schema for specifying criteria for the SignEvmTransaction operation.","items":{"oneOf":[{"$ref":"#/components/schemas/EthValueCriterion"},{"$ref":"#/components/schemas/EvmAddressCriterion"},{"$ref":"#/components/schemas/EvmNetworkCriterion"},{"$ref":"#/components/schemas/EvmDataCriterion"},{"$ref":"#/components/schemas/NetUSDChangeCriterion"}]},"example":[{"type":"ethValue","ethValue":"1000000","operator":">="},{"type":"evmAddress","addresses":["0x742d35Cc6634C0532925a3b844Bc454e4438f44e"],"operator":"in"}]},"SendEvmTransactionRule":{"x-audience":"public","title":"SendEvmTransactionRule","properties":{"action":{"type":"string","description":"Whether matching the rule will cause the request to be rejected or accepted.","example":"accept","enum":["reject","accept"]},"operation":{"type":"string","description":"The operation to which the rule applies. Every element of the `criteria` array must match the specified operation.","example":"sendEvmTransaction","enum":["sendEvmTransaction"]},"criteria":{"$ref":"#/components/schemas/SendEvmTransactionCriteria"}},"required":["action","operation","criteria"]},"EvmMessageCriterion":{"type":"object","x-audience":"public","title":"EvmMessageCriterion","description":"A schema for specifying a criterion for the message being signed.","properties":{"type":{"type":"string","description":"The type of criterion to use. This should be `evmMessage`.","example":"evmMessage","enum":["evmMessage"]},"match":{"type":"string","description":"A regular expression the message is matched against. Accepts valid regular expression syntax described by [RE2](https://github.com/google/re2/wiki/Syntax).","example":"^hello ([a-z]+)$"}},"required":["type","match"]},"SignEvmMessageCriteria":{"x-audience":"public","type":"array","description":"A schema for specifying the rejection criteria for the SignEvmMessage operation.","items":{"oneOf":[{"$ref":"#/components/schemas/EvmMessageCriterion"}]},"example":[{"type":"evmMessage","match":"^hello ([a-z]+)$"}]},"SignEvmMessageRule":{"x-audience":"public","title":"SignEvmMessageRule","properties":{"action":{"type":"string","description":"Whether matching the rule will cause the request to be rejected or accepted.","example":"accept","enum":["reject","accept"]},"operation":{"type":"string","description":"The operation to which the rule applies. Every element of the `criteria` array must match the specified operation.","example":"signEvmMessage","enum":["signEvmMessage"]},"criteria":{"$ref":"#/components/schemas/SignEvmMessageCriteria"}},"required":["action","operation","criteria"]},"EvmTypedAddressCondition":{"type":"object","x-audience":"public","title":"EvmTypedAddressCondition","description":"A schema for specifying criterion for an address field of an EVM typed message. The address can be deeply nested within the typed data's message.","properties":{"addresses":{"type":"array","description":"A list of 0x-prefixed EVM addresses that the value located at the message's path should be compared to. There is a limit of 300 addresses per criterion.","items":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"The 0x-prefixed EVM address that the value located at the message's path should be compared to."},"example":["0x742d35Cc6634C0532925a3b844Bc454e4438f44e","0x1234567890123456789012345678901234567890"]},"operator":{"type":"string","description":"The operator to use for the comparison. The value located at the message's path will be on the left-hand side of the operator, and the `addresses` field will be on the right-hand side.","enum":["in","not in"],"example":"in"},"path":{"type":"string","description":"The path to the field to compare against this criterion. To reference deeply nested fields within the message, separate object keys by `.`, and access array values using `[index]`. If the field does not exist or is not an address, the operation will be rejected.","example":"targets[0].address"}},"required":["addresses","operator","path"]},"EvmTypedNumericalCondition":{"type":"object","x-audience":"public","title":"EvmTypedNumericalCondition","description":"A schema for specifying criterion for a numerical field of an EVM typed message. The value can be deeply nested within the typed data's message.","properties":{"value":{"type":"string","pattern":"^[0-9]+$","description":"The amount that the value located at the message's path should be compared to.","example":"1000000000000000000"},"operator":{"type":"string","description":"The operator to use for the comparison. The value located at the message's path will be on the left-hand side of the operator, and the `value` field will be on the right-hand side.","enum":[">",">=","<","<=","=="],"example":"<="},"path":{"type":"string","description":"The path to the field to compare against this criterion. To reference deeply nested fields within the message, separate object keys by `.`, and access array values using `[index]`. If the field does not exist or is not an address, the operation will be rejected.","example":"targets[0].amount"}},"required":["value","operator","path"]},"EvmTypedStringCondition":{"type":"object","x-audience":"public","title":"EvmTypedStringCondition","description":"A schema for specifying criterion for a string field of an EVM typed message. The value can be deeply nested within the typed data's message.","properties":{"match":{"type":"string","description":"A regular expression the field is matched against.","example":"^hello ([a-z]+)$"},"path":{"type":"string","description":"The path to the field to compare against this criterion. To reference deeply nested fields within the message, separate object keys by `.`, and access array values using `[index]`. If the field does not exist or is not an address, the operation will be rejected.","example":"targets[0].message"}},"required":["match","path"]},"SignEvmTypedDataFieldCriterion":{"x-audience":"public","type":"object","title":"SignEvmTypedDataFieldCriterion","properties":{"type":{"type":"string","description":"The type of criterion to use. This should be `evmTypedDataField`.","example":"evmTypedDataField","enum":["evmTypedDataField"]},"types":{"type":"object","description":"An object containing EIP-712 type definitions, as well as a primary type for the root message object.","example":{"primaryType":"Mail","types":{"Person":[{"name":"name","type":"string"},{"name":"wallet","type":"address"},{"name":"score","type":"uint256"}],"Mail":[{"name":"from","type":"Person"},{"name":"to","type":"Person"},{"name":"contents","type":"string"}]}},"properties":{"types":{"type":"object","description":"EIP-712 compliant map of model names to model definitions.","additionalProperties":{"type":"array","description":"Object containing names and types for fields within structured data.","items":{"type":"object","properties":{"name":{"type":"string","description":"The name of a key within an EIP-712 data structure."},"type":{"type":"string","description":"The Solidity type of a value within an EIP-712 data structure."}}}}},"primaryType":{"type":"string","description":"The name of the root EIP-712 type. This value must be included in the `types` object."}},"required":["types","primaryType"]},"conditions":{"type":"array","items":{"oneOf":[{"$ref":"#/components/schemas/EvmTypedAddressCondition"},{"$ref":"#/components/schemas/EvmTypedNumericalCondition"},{"$ref":"#/components/schemas/EvmTypedStringCondition"}]},"description":"A list of conditions to check against the data being signed. Each condition must be met for the rule to take effect.","example":[{"addresses":["0x742d35Cc6634C0532925a3b844Bc454e4438f44e"],"operator":"in","path":"to.wallet"},{"value":"50","operator":">=","path":"to.score"},{"match":"^hello ([a-z]+)$","path":"contents"}]}},"required":["type","types","conditions"]},"SignEvmTypedDataVerifyingContractCriterion":{"type":"object","x-audience":"public","title":"SignEvmTypedDataVerifyingContractCriterion","description":"A schema for specifying criterion for a domain's verifying contract.","properties":{"type":{"type":"string","description":"The type of criterion to use. This should be `evmTypedDataVerifyingContract`.","example":"evmTypedDataVerifyingContract","enum":["evmTypedDataVerifyingContract"]},"addresses":{"type":"array","description":"A list of 0x-prefixed EVM addresses that the domain's verifying contract should be compared to. There is a limit of 300 addresses per criterion.","items":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"The 0x-prefixed EVM address that the domain's verifying contract should be compared to."},"example":["0x742d35Cc6634C0532925a3b844Bc454e4438f44e","0x1234567890123456789012345678901234567890"]},"operator":{"type":"string","description":"The operator to use for the comparison. The domain's verifying contract will be on the left-hand side of the operator, and the `addresses` field will be on the right-hand side.","enum":["in","not in"],"example":"in"}},"required":["type","addresses","operator"]},"SignEvmTypedDataCriteria":{"x-audience":"public","type":"array","description":"A schema for specifying criteria for the SignEvmTypedData operation.","items":{"oneOf":[{"$ref":"#/components/schemas/SignEvmTypedDataFieldCriterion"},{"$ref":"#/components/schemas/SignEvmTypedDataVerifyingContractCriterion"}]},"example":[{"type":"evmTypedDataField","types":{"types":{"Person":[{"name":"name","type":"string"},{"name":"wallet","type":"address"},{"name":"score","type":"uint256"}],"Mail":[{"name":"from","type":"Person"},{"name":"to","type":"Person"},{"name":"contents","type":"string"}]},"primaryType":"Mail"},"conditions":[{"addresses":["0x742d35Cc6634C0532925a3b844Bc454e4438f44e"],"operator":"in","path":"to.wallet"},{"value":"50","operator":">=","path":"to.score"},{"match":"^hello ([a-z]+)$","path":"contents"}]},{"type":"evmTypedDataVerifyingContract","addresses":["0x742d35Cc6634C0532925a3b844Bc454e4438f44e"],"operator":"in"}]},"SignEvmTypedDataRule":{"x-audience":"public","title":"SignEvmTypedDataRule","properties":{"action":{"type":"string","description":"Whether matching the rule will cause the request to be rejected or accepted.","example":"accept","enum":["reject","accept"]},"operation":{"type":"string","description":"The operation to which the rule applies. Every element of the `criteria` array must match the specified operation.","example":"signEvmTypedData","enum":["signEvmTypedData"]},"criteria":{"$ref":"#/components/schemas/SignEvmTypedDataCriteria"}},"required":["action","operation","criteria"]},"SolAddressCriterion":{"type":"object","title":"SolAddressCriterion","description":"The criterion for the recipient addresses of a Solana transaction's native transfer instruction.","properties":{"type":{"type":"string","description":"The type of criterion to use. This should be `solAddress`.","example":"solAddress","enum":["solAddress"]},"addresses":{"type":"array","description":"The Solana addresses that are compared to the list of native transfer recipient addresses in the transaction's `accountKeys` (for legacy transactions) or `staticAccountKeys` (for V0 transactions) array.","items":{"type":"string","pattern":"^[1-9A-HJ-NP-Za-km-z]{32,44}$","description":"The Solana address that is compared to the list of native transfer recipient addresses in the transaction's `accountKeys` (for legacy transactions) or `staticAccountKeys` (for V0 transactions) array."},"example":["HpabPRRCFbBKSuJr5PdkVvQc85FyxyTWkFM2obBRSvHT"]},"operator":{"type":"string","description":"The operator to use for the comparison. Each of the native transfer recipient addresses in the transaction's `accountKeys` (for legacy transactions) or `staticAccountKeys` (for V0 transactions) array will be on the left-hand side of the operator, and the `addresses` field will be on the right-hand side.","enum":["in","not in"],"example":"in"}},"required":["type","addresses","operator"]},"SolValueCriterion":{"x-audience":"public","type":"object","title":"SolValueCriterion","description":"The criterion for the SOL value in lamports of a native transfer instruction in a Solana transaction.","properties":{"type":{"type":"string","description":"The type of criterion to use. This should be `solValue`.","example":"solValue","enum":["solValue"]},"solValue":{"type":"string","description":"The amount of SOL in lamports that the transaction instruction's `value` field should be compared to.","example":"1000000000000000000"},"operator":{"type":"string","description":"The operator to use for the comparison. The transaction instruction's `value` field will be on the left-hand side of the operator, and the `solValue` field will be on the right-hand side.","enum":[">",">=","<","<=","=="],"example":"<="}},"required":["type","solValue","operator"]},"SplAddressCriterion":{"x-audience":"public","type":"object","title":"SplAddressCriterion","description":"The criterion for the recipient addresses of a Solana transaction's SPL token transfer instructions.","properties":{"type":{"type":"string","description":"The type of criterion to use. This should be `splAddress`.","example":"splAddress","enum":["splAddress"]},"addresses":{"type":"array","description":"The Solana addresses that are compared to the list of SPL token transfer recipient addresses in the transaction's `accountKeys` (for legacy transactions) or `staticAccountKeys` (for V0 transactions) array.","items":{"type":"string","pattern":"^[1-9A-HJ-NP-Za-km-z]{32,44}$","description":"The Solana address that is compared to the list of SPL token transfer recipient addresses in the transaction's `accountKeys` (for legacy transactions) or `staticAccountKeys` (for V0 transactions) array."},"example":["HpabPRRCFbBKSuJr5PdkVvQc85FyxyTWkFM2obBRSvHT"]},"operator":{"type":"string","description":"The operator to use for the comparison. Each of the SPL token transfer recipient addresses in the transaction's `accountKeys` (for legacy transactions) or `staticAccountKeys` (for V0 transactions) array will be on the left-hand side of the operator, and the `addresses` field will be on the right-hand side.","enum":["in","not in"],"example":"in"}},"required":["type","addresses","operator"]},"SplValueCriterion":{"x-audience":"public","type":"object","title":"SplValueCriterion","description":"The criterion for the SPL token value of a SPL token transfer instruction in a Solana transaction.","properties":{"type":{"type":"string","description":"The type of criterion to use. This should be `splValue`.","example":"splValue","enum":["splValue"]},"splValue":{"type":"string","description":"The amount of the SPL token that the transaction instruction's `value` field should be compared to.","example":"1000000000000000000"},"operator":{"type":"string","description":"The operator to use for the comparison. The transaction instruction's `value` field will be on the left-hand side of the operator, and the `splValue` field will be on the right-hand side.","enum":[">",">=","<","<=","=="],"example":"<="}},"required":["type","splValue","operator"]},"MintAddressCriterion":{"x-audience":"public","type":"object","title":"MintAddressCriterion","description":"The criterion for the token mint addresses of a Solana transaction's SPL token transfer instructions.","properties":{"type":{"type":"string","description":"The type of criterion to use. This should be `mintAddress`.","example":"mintAddress","enum":["mintAddress"]},"addresses":{"type":"array","description":"The Solana addresses that are compared to the list of token mint addresses in the transaction's `accountKeys` (for legacy transactions) or `staticAccountKeys` (for V0 transactions) array.","items":{"type":"string","pattern":"^[1-9A-HJ-NP-Za-km-z]{32,44}$","description":"The Solana address that is compared to the list of token mint addresses in the transaction's `accountKeys` (for legacy transactions) or `staticAccountKeys` (for V0 transactions) array."},"example":["HpabPRRCFbBKSuJr5PdkVvQc85FyxyTWkFM2obBRSvHT"]},"operator":{"type":"string","description":"The operator to use for the comparison. Each of the token mint addresses in the transaction's `accountKeys` (for legacy transactions) or `staticAccountKeys` (for V0 transactions) array will be on the left-hand side of the operator, and the `addresses` field will be on the right-hand side.","enum":["in","not in"],"example":"in"}},"required":["type","addresses","operator"]},"KnownIdlType":{"type":"string","x-audience":"public","title":"KnownIdlType","description":"A reference to an established Solana program. When referencing a `KnownIdlType` within a policy rule configuring an `SolDataCriterion`, criteria will decode instruction data as documented in the programs. For more information on supported programs, see the links below.\n  - [SystemProgram](https://docs.rs/solana-program/latest/solana_program/system_instruction/enum.SystemInstruction.html).\n  - [TokenProgram](https://docs.rs/spl-token/latest/spl_token/instruction/enum.TokenInstruction.html).\n  - [AssociatedTokenProgram](https://docs.rs/spl-associated-token-account/latest/spl_associated_token_account/instruction/index.html).","enum":["SystemProgram","TokenProgram","AssociatedTokenProgram"]},"Idl":{"x-audience":"public","type":"object","description":"IDL Specification following Anchor's IDL format v0.30+.","required":["address","instructions"],"properties":{"address":{"type":"string","description":"The program address.","example":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},"instructions":{"type":"array","description":"List of program instructions.","example":[{"name":"transfer_checked","discriminator":[119,250,202,24,253,135,244,121],"accounts":[{"name":"mint","writable":true},{"name":"rent"}],"args":[{"name":"amount","type":"u64"},{"name":"decimals","type":"u8"}]}],"items":{"type":"object","required":["name","discriminator","args"],"properties":{"name":{"type":"string","description":"The instruction name.","example":"transfer_checked"},"discriminator":{"type":"array","description":"Array of 8 numbers representing the instruction discriminator.","items":{"type":"integer","minimum":0,"maximum":255},"minItems":8,"maxItems":8,"example":[119,250,202,24,253,135,244,121]},"args":{"type":"array","description":"List of instruction arguments.","items":{"type":"object","required":["name","type"],"properties":{"name":{"type":"string","description":"The argument name.","example":"amount"},"type":{"type":"string","description":"The argument type.","example":"u64"}}}},"accounts":{"type":"array","description":"Optional list of accounts required by the instruction.","items":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"The account name.","example":"mint"},"writable":{"type":"boolean","description":"Whether the account is writable.","example":true},"signer":{"type":"boolean","description":"Whether the account must be a signer.","example":false}}}}}}},"metadata":{"type":"object","description":"Optional metadata about the IDL.","example":{"name":"system_program","version":"0.1.0","spec":"0.1.0"},"properties":{"name":{"type":"string","description":"The program name.","example":"system_program"},"version":{"type":"string","description":"The program version.","example":"0.1.0"},"spec":{"type":"string","description":"The IDL specification version.","example":"0.1.0"}}},"types":{"type":"array","description":"Optional type definitions for custom data structures used in the program.","items":{"type":"object"},"example":[{"name":"MyStruct","type":"struct","fields":[{"name":"id","type":"u64"},{"name":"owner","type":"pubkey"}]}]}}},"SolDataParameterCondition":{"type":"object","x-audience":"public","title":"SolDataParameterCondition","description":"A single parameter condition to apply against a specific instruction's parameters.","properties":{"name":{"type":"string","description":"The parameter name.","example":"amount"},"operator":{"type":"string","description":"The operator to use for the comparison. The value resolved at the `name` will be on the left-hand side of the operator, and the `value` field will be on the right-hand side.","enum":[">",">=","<","<=","=="],"example":"=="},"value":{"type":"string","description":"The value to compare against.","example":"1000000"}},"required":["name","operator","value"]},"SolDataParameterConditionList":{"type":"object","x-audience":"public","title":"SolDataParameterConditionList","description":"A single parameter condition to apply against a specific instruction's parameters.","properties":{"name":{"type":"string","description":"The parameter name.","example":"amount"},"operator":{"type":"string","description":"The operator to use for the comparison. The value resolved at the `name` will be on the left-hand side of the operator, and the `value` field will be on the right-hand side.","enum":["in","not in"],"example":"in"},"values":{"type":"array","description":"The values to compare against.","items":{"type":"string","description":"A single potential value to compare against the resolved `name` value.","example":"1000000"},"example":["1000000","HpabPRRCFbBKSuJr5PdkVvQc85FyxyTWkFM2obBRSvHT","6"]}},"required":["name","operator","values"]},"SolDataCondition":{"type":"object","x-audience":"public","description":"A single condition to apply against a specific instruction type and its parameters.","properties":{"instruction":{"type":"string","description":"The instruction name.","example":"transfer_checked"},"params":{"type":"array","description":"Parameter conditions for the instruction.","items":{"description":"A list of parameter conditions to apply against a specific instruction's data.","oneOf":[{"$ref":"#/components/schemas/SolDataParameterCondition"},{"$ref":"#/components/schemas/SolDataParameterConditionList"}]},"example":[{"name":"amount","operator":"<=","value":"1000000"},{"name":"decimals","operator":"==","value":"6"},{"name":"owner","operator":"in","values":["TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","So11111111111111111111111111111111111111112"]}]}},"required":["instruction"]},"SolDataCriterion":{"x-audience":"public","type":"object","description":"A schema for specifying criterion for instruction data in a Solana transaction.","properties":{"type":{"type":"string","description":"The type of criterion to use. This should be `solData`.","example":"solData","enum":["solData"]},"idls":{"type":"array","description":"List of IDL specifications. Can contain known program names (strings) or custom IDL objects.","items":{"oneOf":[{"$ref":"#/components/schemas/KnownIdlType"},{"$ref":"#/components/schemas/Idl"}]},"example":["SystemProgram","TokenProgram",{"address":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","instructions":[{"name":"transfer_checked","discriminator":[119,250,202,24,253,135,244,121],"args":[{"name":"amount","type":"u64"},{"name":"decimals","type":"u8"}]}]}]},"conditions":{"type":"array","description":"A list of conditions to apply against the transaction instruction. Only one condition must evaluate to true for this criterion to be met.","items":{"$ref":"#/components/schemas/SolDataCondition"},"example":[{"instruction":"transfer_checked","params":[{"name":"lamports","operator":"<=","value":"1000000"},{"name":"space","operator":"==","value":"64"}]}]}},"required":["type","idls","conditions"]},"ProgramIdCriterion":{"x-audience":"public","type":"object","title":"ProgramIdCriterion","description":"The criterion for the program IDs of a Solana transaction's instructions.","properties":{"type":{"type":"string","description":"The type of criterion to use. This should be `programId`.","example":"programId","enum":["programId"]},"programIds":{"type":"array","description":"The Solana program IDs that are compared to the list of program IDs in the transaction's instructions.","items":{"type":"string","pattern":"^[1-9A-HJ-NP-Za-km-z]{32,44}$","description":"The Solana program ID that is compared to the list of program IDs in the transaction's instructions."},"example":["TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","11111111111111111111111111111112"]},"operator":{"type":"string","description":"The operator to use for the comparison. Each of the program IDs in the transaction's instructions will be on the left-hand side of the operator, and the `programIds` field will be on the right-hand side.","enum":["in","not in"],"example":"in"}},"required":["type","programIds","operator"]},"SignSolTransactionCriteria":{"type":"array","x-audience":"public","description":"A schema for specifying criteria for the SignSolTransaction operation.","items":{"oneOf":[{"$ref":"#/components/schemas/SolAddressCriterion"},{"$ref":"#/components/schemas/SolValueCriterion"},{"$ref":"#/components/schemas/SplAddressCriterion"},{"$ref":"#/components/schemas/SplValueCriterion"},{"$ref":"#/components/schemas/MintAddressCriterion"},{"$ref":"#/components/schemas/SolDataCriterion"},{"$ref":"#/components/schemas/ProgramIdCriterion"}]},"example":[{"type":"solAddress","addresses":["HpabPRRCFbBKSuJr5PdkVvQc85FyxyTWkFM2obBRSvHT"],"operator":"in"}]},"SignSolTransactionRule":{"title":"SignSolTransactionRule","properties":{"action":{"type":"string","description":"Whether matching the rule will cause the request to be rejected or accepted.","example":"accept","enum":["reject","accept"]},"operation":{"type":"string","description":"The operation to which the rule applies. Every element of the `criteria` array must match the specified operation.","example":"signSolTransaction","enum":["signSolTransaction"]},"criteria":{"$ref":"#/components/schemas/SignSolTransactionCriteria"}},"required":["action","operation","criteria"]},"SolNetworkCriterion":{"x-audience":"public","type":"object","title":"SolNetworkCriterion","description":"The criterion for the Solana network of a transaction.","properties":{"type":{"type":"string","description":"The type of criterion to use. This should be `solNetwork`.","example":"solNetwork","enum":["solNetwork"]},"networks":{"type":"array","description":"The Solana networks that the transaction's intended network should be compared to.","items":{"type":"string","description":"The Solana network the transaction is for.","enum":["solana-devnet","solana"],"example":"solana-devnet"},"example":["solana-devnet","solana"]},"operator":{"type":"string","description":"The operator to use for the comparison. The transaction's intended network will be on the left-hand side of the operator, and the `networks` field will be on the right-hand side.","enum":["in","not in"],"example":"in"}},"required":["type","networks","operator"]},"SendSolTransactionCriteria":{"x-audience":"public","type":"array","description":"A schema for specifying criteria for the SendSolTransaction operation.","items":{"oneOf":[{"$ref":"#/components/schemas/SolAddressCriterion"},{"$ref":"#/components/schemas/SolValueCriterion"},{"$ref":"#/components/schemas/SplAddressCriterion"},{"$ref":"#/components/schemas/SplValueCriterion"},{"$ref":"#/components/schemas/MintAddressCriterion"},{"$ref":"#/components/schemas/SolDataCriterion"},{"$ref":"#/components/schemas/ProgramIdCriterion"},{"$ref":"#/components/schemas/SolNetworkCriterion"}]},"example":[{"type":"solAddress","addresses":["HpabPRRCFbBKSuJr5PdkVvQc85FyxyTWkFM2obBRSvHT"],"operator":"in"},{"type":"solValue","solValue":"1000000000000000000","operator":"<="}]},"SendSolTransactionRule":{"x-audience":"public","title":"SendSolTransactionRule","properties":{"action":{"type":"string","description":"Whether matching the rule will cause the request to be rejected or accepted.","example":"accept","enum":["reject","accept"]},"operation":{"type":"string","description":"The operation to which the rule applies. Every element of the `criteria` array must match the specified operation.","example":"sendSolTransaction","enum":["sendSolTransaction"]},"criteria":{"$ref":"#/components/schemas/SendSolTransactionCriteria"}},"required":["action","operation","criteria"]},"SolMessageCriterion":{"x-audience":"public","type":"object","title":"SolMessageCriterion","description":"The criterion for the message of a Solana transaction.","properties":{"type":{"type":"string","description":"The type of criterion to use. This should be `solMessage`.","example":"solMessage","enum":["solMessage"]},"match":{"type":"string","description":"A regular expression the field is matched against.","example":"^hello ([a-z]+)$"}},"required":["type","match"]},"SignSolMessageCriteria":{"x-audience":"public","type":"array","description":"A schema for specifying criteria for the SignSolMessage operation.","items":{"oneOf":[{"$ref":"#/components/schemas/SolMessageCriterion"}]},"example":[{"type":"solMessage","match":"^hello ([a-z]+)$"}]},"SignSolMessageRule":{"x-audience":"public","title":"SignSolMessageRule","properties":{"action":{"type":"string","description":"Whether matching the rule will cause the request to be rejected or accepted.","example":"accept","enum":["reject","accept"]},"operation":{"type":"string","description":"The operation to which the rule applies. Every element of the `criteria` array must match the specified operation.","example":"signSolMessage","enum":["signSolMessage"]},"criteria":{"$ref":"#/components/schemas/SignSolMessageCriteria"}},"required":["action","operation","criteria"]},"SignEvmHashRule":{"x-audience":"public","title":"SignEvmHashRule","properties":{"action":{"type":"string","description":"Whether any attempts to sign a hash will be accepted or rejected. This rule does not accept any criteria.","example":"accept","enum":["reject","accept"]},"operation":{"type":"string","description":"The operation to which the rule applies.","example":"signEvmHash","enum":["signEvmHash"]}},"required":["action","operation"]},"PrepareUserOperationCriteria":{"x-audience":"public","type":"array","description":"A schema for specifying criteria for the PrepareUserOperation operation.","items":{"oneOf":[{"$ref":"#/components/schemas/EthValueCriterion"},{"$ref":"#/components/schemas/EvmAddressCriterion"},{"$ref":"#/components/schemas/EvmNetworkCriterion"},{"$ref":"#/components/schemas/EvmDataCriterion"},{"$ref":"#/components/schemas/NetUSDChangeCriterion"}]},"example":[{"type":"ethValue","ethValue":"1000000","operator":">="},{"type":"evmAddress","addresses":["0x742d35Cc6634C0532925a3b844Bc454e4438f44e"],"operator":"in"}]},"PrepareUserOperationRule":{"x-audience":"public","title":"PrepareUserOperationRule","properties":{"action":{"type":"string","description":"Whether matching the rule will cause the request to be rejected or accepted.","example":"accept","enum":["reject","accept"]},"operation":{"type":"string","description":"The operation to which the rule applies. Every element of the `criteria` array must match the specified operation.","example":"prepareUserOperation","enum":["prepareUserOperation"]},"criteria":{"$ref":"#/components/schemas/PrepareUserOperationCriteria"}},"required":["action","operation","criteria"]},"SendUserOperationCriteria":{"x-audience":"public","type":"array","description":"A schema for specifying criteria for the SendUserOperation operation.","items":{"oneOf":[{"$ref":"#/components/schemas/EthValueCriterion"},{"$ref":"#/components/schemas/EvmAddressCriterion"},{"$ref":"#/components/schemas/EvmNetworkCriterion"},{"$ref":"#/components/schemas/EvmDataCriterion"},{"$ref":"#/components/schemas/NetUSDChangeCriterion"}]},"example":[{"type":"ethValue","ethValue":"1000000","operator":">="},{"type":"evmAddress","addresses":["0x742d35Cc6634C0532925a3b844Bc454e4438f44e"],"operator":"in"}]},"SendUserOperationRule":{"x-audience":"public","title":"SendUserOperationRule","properties":{"action":{"type":"string","description":"Whether matching the rule will cause the request to be rejected or accepted.","example":"accept","enum":["reject","accept"]},"operation":{"type":"string","description":"The operation to which the rule applies. Every element of the `criteria` array must match the specified operation.","example":"sendUserOperation","enum":["sendUserOperation"]},"criteria":{"$ref":"#/components/schemas/SendUserOperationCriteria"}},"required":["action","operation","criteria"]},"SignEndUserEvmTransactionCriteria":{"x-audience":"public","type":"array","description":"A schema for specifying criteria for the signEndUserEvmTransaction operation.","items":{"oneOf":[{"$ref":"#/components/schemas/EthValueCriterion"},{"$ref":"#/components/schemas/EvmAddressCriterion"},{"$ref":"#/components/schemas/EvmDataCriterion"},{"$ref":"#/components/schemas/NetUSDChangeCriterion"}]},"example":[{"type":"ethValue","ethValue":"1000000","operator":">="},{"type":"evmAddress","addresses":["0x742d35Cc6634C0532925a3b844Bc454e4438f44e"],"operator":"in"},{"type":"evmData","abi":"erc20","conditions":[{"function":"transfer","params":[{"name":"value","operator":"<=","value":"10000"}]}]},{"type":"netUSDChange","changeCents":10000,"operator":"<="}]},"SignEndUserEvmTransactionRule":{"x-audience":"public","title":"SignEndUserEvmTransactionRule","properties":{"action":{"type":"string","description":"Whether matching the rule will cause the request to be rejected or accepted.","example":"accept","enum":["reject","accept"]},"operation":{"type":"string","description":"The operation to which the rule applies. Every element of the `criteria` array must match the specified operation.","example":"signEndUserEvmTransaction","enum":["signEndUserEvmTransaction"]},"criteria":{"$ref":"#/components/schemas/SignEndUserEvmTransactionCriteria"}},"required":["action","operation","criteria"]},"SendEndUserEvmTransactionCriteria":{"x-audience":"public","type":"array","description":"A schema for specifying criteria for the sendEndUserEvmTransaction operation.","items":{"oneOf":[{"$ref":"#/components/schemas/EthValueCriterion"},{"$ref":"#/components/schemas/EvmAddressCriterion"},{"$ref":"#/components/schemas/EvmNetworkCriterion"},{"$ref":"#/components/schemas/EvmDataCriterion"},{"$ref":"#/components/schemas/NetUSDChangeCriterion"}]},"example":[{"type":"ethValue","ethValue":"1000000","operator":">="},{"type":"evmAddress","addresses":["0x742d35Cc6634C0532925a3b844Bc454e4438f44e"],"operator":"in"},{"type":"evmNetwork","networks":["base","ethereum"],"operator":"in"},{"type":"evmData","abi":"erc20","conditions":[{"function":"transfer","params":[{"name":"value","operator":"<=","value":"10000"}]}]},{"type":"netUSDChange","changeCents":10000,"operator":"<="}]},"SendEndUserEvmTransactionRule":{"x-audience":"public","title":"SendEndUserEvmTransactionRule","properties":{"action":{"type":"string","description":"Whether matching the rule will cause the request to be rejected or accepted.","example":"accept","enum":["reject","accept"]},"operation":{"type":"string","description":"The operation to which the rule applies. Every element of the `criteria` array must match the specified operation.","example":"sendEndUserEvmTransaction","enum":["sendEndUserEvmTransaction"]},"criteria":{"$ref":"#/components/schemas/SendEndUserEvmTransactionCriteria"}},"required":["action","operation","criteria"]},"SignEndUserEvmMessageCriteria":{"x-audience":"public","type":"array","description":"A schema for specifying criteria for the signEndUserEvmMessage operation.","items":{"oneOf":[{"$ref":"#/components/schemas/EvmMessageCriterion"}]},"example":[{"type":"evmMessage","match":"^hello ([a-z]+)$"}]},"SignEndUserEvmMessageRule":{"x-audience":"public","title":"SignEndUserEvmMessageRule","properties":{"action":{"type":"string","description":"Whether matching the rule will cause the request to be rejected or accepted.","example":"accept","enum":["reject","accept"]},"operation":{"type":"string","description":"The operation to which the rule applies. Every element of the `criteria` array must match the specified operation.","example":"signEndUserEvmMessage","enum":["signEndUserEvmMessage"]},"criteria":{"$ref":"#/components/schemas/SignEndUserEvmMessageCriteria"}},"required":["action","operation","criteria"]},"SignEndUserEvmTypedDataCriteria":{"x-audience":"public","type":"array","description":"A schema for specifying criteria for the signEndUserEvmTypedData operation.","items":{"oneOf":[{"$ref":"#/components/schemas/SignEvmTypedDataFieldCriterion"},{"$ref":"#/components/schemas/SignEvmTypedDataVerifyingContractCriterion"}]},"example":[{"type":"evmTypedDataField","types":{"types":{"Person":[{"name":"name","type":"string"},{"name":"wallet","type":"address"},{"name":"score","type":"uint256"}],"Mail":[{"name":"from","type":"Person"},{"name":"to","type":"Person"},{"name":"contents","type":"string"}]},"primaryType":"Mail"},"conditions":[{"addresses":["0x742d35Cc6634C0532925a3b844Bc454e4438f44e"],"operator":"in","path":"to.wallet"},{"value":"50","operator":">=","path":"to.score"},{"match":"^hello ([a-z]+)$","path":"contents"}]},{"type":"evmTypedDataVerifyingContract","addresses":["0x742d35Cc6634C0532925a3b844Bc454e4438f44e"],"operator":"in"}]},"SignEndUserEvmTypedDataRule":{"x-audience":"public","title":"SignEndUserEvmTypedDataRule","properties":{"action":{"type":"string","description":"Whether matching the rule will cause the request to be rejected or accepted.","example":"accept","enum":["reject","accept"]},"operation":{"type":"string","description":"The operation to which the rule applies. Every element of the `criteria` array must match the specified operation.","example":"signEndUserEvmTypedData","enum":["signEndUserEvmTypedData"]},"criteria":{"$ref":"#/components/schemas/SignEndUserEvmTypedDataCriteria"}},"required":["action","operation","criteria"]},"SignEndUserEvmHashRule":{"x-audience":"public","title":"SignEndUserEvmHashRule","properties":{"action":{"type":"string","description":"Whether any attempts to sign a hash will be accepted or rejected. This rule does not accept any criteria.","example":"accept","enum":["reject","accept"]},"operation":{"type":"string","description":"The operation to which the rule applies.","example":"signEndUserEvmHash","enum":["signEndUserEvmHash"]}},"required":["action","operation"]},"SignEndUserSolTransactionCriteria":{"x-audience":"public","type":"array","description":"A schema for specifying criteria for the signEndUserSolTransaction operation.","items":{"oneOf":[{"$ref":"#/components/schemas/SolAddressCriterion"},{"$ref":"#/components/schemas/SolValueCriterion"},{"$ref":"#/components/schemas/SplAddressCriterion"},{"$ref":"#/components/schemas/SplValueCriterion"},{"$ref":"#/components/schemas/MintAddressCriterion"},{"$ref":"#/components/schemas/SolDataCriterion"},{"$ref":"#/components/schemas/ProgramIdCriterion"}]},"example":[{"type":"solAddress","addresses":["HpabPRRCFbBKSuJr5PdkVvQc85FyxyTWkFM2obBRSvHT"],"operator":"in"},{"type":"solValue","solValue":"1000000000000000000","operator":"<="},{"type":"splAddress","addresses":["HpabPRRCFbBKSuJr5PdkVvQc85FyxyTWkFM2obBRSvHT"],"operator":"in"},{"type":"splValue","splValue":"1000000000000000000","operator":"<="},{"type":"mintAddress","addresses":["HpabPRRCFbBKSuJr5PdkVvQc85FyxyTWkFM2obBRSvHT"],"operator":"in"},{"type":"solData","idls":["SystemProgram"],"conditions":[{"instruction":"transfer_checked","params":[{"name":"lamports","operator":"<=","value":"1000000"}]}]},{"type":"programId","programIds":["TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"],"operator":"in"}]},"SignEndUserSolTransactionRule":{"x-audience":"public","title":"SignEndUserSolTransactionRule","properties":{"action":{"type":"string","description":"Whether matching the rule will cause the request to be rejected or accepted.","example":"accept","enum":["reject","accept"]},"operation":{"type":"string","description":"The operation to which the rule applies. Every element of the `criteria` array must match the specified operation.","example":"signEndUserSolTransaction","enum":["signEndUserSolTransaction"]},"criteria":{"$ref":"#/components/schemas/SignEndUserSolTransactionCriteria"}},"required":["action","operation","criteria"]},"SendEndUserSolTransactionCriteria":{"x-audience":"public","type":"array","description":"A schema for specifying criteria for the sendEndUserSolTransaction operation.","items":{"oneOf":[{"$ref":"#/components/schemas/SolAddressCriterion"},{"$ref":"#/components/schemas/SolValueCriterion"},{"$ref":"#/components/schemas/SplAddressCriterion"},{"$ref":"#/components/schemas/SplValueCriterion"},{"$ref":"#/components/schemas/MintAddressCriterion"},{"$ref":"#/components/schemas/SolDataCriterion"},{"$ref":"#/components/schemas/ProgramIdCriterion"},{"$ref":"#/components/schemas/SolNetworkCriterion"}]},"example":[{"type":"solAddress","addresses":["HpabPRRCFbBKSuJr5PdkVvQc85FyxyTWkFM2obBRSvHT"],"operator":"in"},{"type":"solValue","solValue":"1000000000000000000","operator":"<="},{"type":"splAddress","addresses":["HpabPRRCFbBKSuJr5PdkVvQc85FyxyTWkFM2obBRSvHT"],"operator":"in"},{"type":"splValue","splValue":"1000000000000000000","operator":"<="},{"type":"mintAddress","addresses":["HpabPRRCFbBKSuJr5PdkVvQc85FyxyTWkFM2obBRSvHT"],"operator":"in"},{"type":"solData","idls":["SystemProgram"],"conditions":[{"instruction":"transfer_checked","params":[{"name":"lamports","operator":"<=","value":"1000000"}]}]},{"type":"programId","programIds":["TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"],"operator":"in"},{"type":"solNetwork","networks":["solana-devnet","solana"],"operator":"in"}]},"SendEndUserSolTransactionRule":{"x-audience":"public","title":"SendEndUserSolTransactionRule","properties":{"action":{"type":"string","description":"Whether matching the rule will cause the request to be rejected or accepted.","example":"accept","enum":["reject","accept"]},"operation":{"type":"string","description":"The operation to which the rule applies. Every element of the `criteria` array must match the specified operation.","example":"sendEndUserSolTransaction","enum":["sendEndUserSolTransaction"]},"criteria":{"$ref":"#/components/schemas/SendEndUserSolTransactionCriteria"}},"required":["action","operation","criteria"]},"SignEndUserSolMessageCriteria":{"x-audience":"public","type":"array","description":"A schema for specifying criteria for the signEndUserSolMessage operation.","items":{"oneOf":[{"$ref":"#/components/schemas/SolMessageCriterion"}]},"example":[{"type":"solMessage","match":"^hello ([a-z]+)$"}]},"SignEndUserSolMessageRule":{"x-audience":"public","title":"SignEndUserSolMessageRule","properties":{"action":{"type":"string","description":"Whether matching the rule will cause the request to be rejected or accepted.","example":"accept","enum":["reject","accept"]},"operation":{"type":"string","description":"The operation to which the rule applies. Every element of the `criteria` array must match the specified operation.","example":"signEndUserSolMessage","enum":["signEndUserSolMessage"]},"criteria":{"$ref":"#/components/schemas/SignEndUserSolMessageCriteria"}},"required":["action","operation","criteria"]},"SendEndUserEvmAssetCriteria":{"x-audience":"public","type":"array","description":"A schema for specifying criteria for the sendEndUserEvmAsset operation.","items":{"oneOf":[{"$ref":"#/components/schemas/EvmNetworkCriterion"},{"$ref":"#/components/schemas/EvmDataCriterion"},{"$ref":"#/components/schemas/NetUSDChangeCriterion"}]},"example":[{"type":"ethValue","ethValue":"1000000","operator":">="},{"type":"evmAddress","addresses":["0x742d35Cc6634C0532925a3b844Bc454e4438f44e"],"operator":"in"},{"type":"evmNetwork","networks":["base","ethereum"],"operator":"in"},{"type":"evmData","abi":"erc20","conditions":[{"function":"transfer","params":[{"name":"value","operator":"<=","value":"10000"}]}]},{"type":"netUSDChange","changeCents":10000,"operator":"<="}]},"SendEndUserEvmAssetRule":{"x-audience":"public","title":"SendEndUserEvmAssetRule","properties":{"action":{"type":"string","description":"Whether matching the rule will cause the request to be rejected or accepted.","example":"accept","enum":["reject","accept"]},"operation":{"type":"string","description":"The operation to which the rule applies. Every element of the `criteria` array must match the specified operation.","example":"sendEndUserEvmAsset","enum":["sendEndUserEvmAsset"]},"criteria":{"$ref":"#/components/schemas/SendEndUserEvmAssetCriteria"}},"required":["action","operation","criteria"]},"SendEndUserSolAssetCriteria":{"x-audience":"public","type":"array","description":"A schema for specifying criteria for the sendEndUserSolAsset operation.","items":{"oneOf":[{"$ref":"#/components/schemas/SplAddressCriterion"},{"$ref":"#/components/schemas/SplValueCriterion"},{"$ref":"#/components/schemas/SolDataCriterion"},{"$ref":"#/components/schemas/SolNetworkCriterion"}]},"example":[{"type":"splAddress","addresses":["HpabPRRCFbBKSuJr5PdkVvQc85FyxyTWkFM2obBRSvHT"],"operator":"in"},{"type":"splValue","splValue":"1000000000000000000","operator":"<="},{"type":"solData","idls":["SystemProgram"],"conditions":[{"instruction":"transfer_checked","params":[{"name":"lamports","operator":"<=","value":"1000000"}]}]},{"type":"solNetwork","networks":["solana-devnet","solana"],"operator":"in"}]},"SendEndUserSolAssetRule":{"x-audience":"public","title":"SendEndUserSolAssetRule","properties":{"action":{"type":"string","description":"Whether matching the rule will cause the request to be rejected or accepted.","example":"accept","enum":["reject","accept"]},"operation":{"type":"string","description":"The operation to which the rule applies. Every element of the `criteria` array must match the specified operation.","example":"sendEndUserSolAsset","enum":["sendEndUserSolAsset"]},"criteria":{"$ref":"#/components/schemas/SendEndUserSolAssetCriteria"}},"required":["action","operation","criteria"]},"SendEndUserOperationCriteria":{"x-audience":"public","type":"array","description":"A schema for specifying criteria for the sendEndUserOperation operation.","items":{"oneOf":[{"$ref":"#/components/schemas/EthValueCriterion"},{"$ref":"#/components/schemas/EvmAddressCriterion"},{"$ref":"#/components/schemas/EvmNetworkCriterion"},{"$ref":"#/components/schemas/EvmDataCriterion"},{"$ref":"#/components/schemas/NetUSDChangeCriterion"}]},"example":[{"type":"ethValue","ethValue":"1000000","operator":">="},{"type":"evmAddress","addresses":["0x742d35Cc6634C0532925a3b844Bc454e4438f44e"],"operator":"in"},{"type":"evmNetwork","networks":["base","ethereum"],"operator":"in"},{"type":"evmData","abi":"erc20","conditions":[{"function":"transfer","params":[{"name":"value","operator":"<=","value":"10000"}]}]},{"type":"netUSDChange","changeCents":10000,"operator":"<="}]},"SendEndUserOperationRule":{"x-audience":"public","title":"SendEndUserOperationRule","properties":{"action":{"type":"string","description":"Whether matching the rule will cause the request to be rejected or accepted.","example":"accept","enum":["reject","accept"]},"operation":{"type":"string","description":"The operation to which the rule applies. Every element of the `criteria` array must match the specified operation.","example":"sendEndUserOperation","enum":["sendEndUserOperation"]},"criteria":{"$ref":"#/components/schemas/SendEndUserOperationCriteria"}},"required":["action","operation","criteria"]},"CreateEndUserEvmSwapCriteria":{"x-audience":"public","type":"array","description":"A schema for specifying criteria for the createEndUserEvmSwap operation.","items":{"oneOf":[{"$ref":"#/components/schemas/EvmNetworkCriterion"},{"$ref":"#/components/schemas/EvmDataCriterion"},{"$ref":"#/components/schemas/NetUSDChangeCriterion"}]},"example":[{"type":"evmNetwork","networks":["base","ethereum"],"operator":"in"},{"type":"evmData","abi":"erc20","conditions":[{"function":"transfer","params":[{"name":"value","operator":"<=","value":"10000"}]}]},{"type":"netUSDChange","changeCents":10000,"operator":"<="}]},"CreateEndUserEvmSwapRule":{"x-audience":"public","title":"CreateEndUserEvmSwapRule","properties":{"action":{"type":"string","description":"Whether matching the rule will cause the request to be rejected or accepted.","example":"accept","enum":["reject","accept"]},"operation":{"type":"string","description":"The operation to which the rule applies. Every element of the `criteria` array must match the specified operation.","example":"createEndUserEvmSwap","enum":["createEndUserEvmSwap"]},"criteria":{"$ref":"#/components/schemas/CreateEndUserEvmSwapCriteria"}},"required":["action","operation","criteria"]},"Rule":{"type":"object","description":"A rule that limits the behavior of an account.","oneOf":[{"$ref":"#/components/schemas/SignEvmTransactionRule"},{"$ref":"#/components/schemas/SendEvmTransactionRule"},{"$ref":"#/components/schemas/SignEvmMessageRule"},{"$ref":"#/components/schemas/SignEvmTypedDataRule"},{"$ref":"#/components/schemas/SignSolTransactionRule"},{"$ref":"#/components/schemas/SendSolTransactionRule"},{"$ref":"#/components/schemas/SignSolMessageRule"},{"$ref":"#/components/schemas/SignEvmHashRule"},{"$ref":"#/components/schemas/PrepareUserOperationRule"},{"$ref":"#/components/schemas/SendUserOperationRule"},{"$ref":"#/components/schemas/SignEndUserEvmTransactionRule"},{"$ref":"#/components/schemas/SendEndUserEvmTransactionRule"},{"$ref":"#/components/schemas/SignEndUserEvmMessageRule"},{"$ref":"#/components/schemas/SignEndUserEvmTypedDataRule"},{"$ref":"#/components/schemas/SignEndUserEvmHashRule"},{"$ref":"#/components/schemas/SignEndUserSolTransactionRule"},{"$ref":"#/components/schemas/SendEndUserSolTransactionRule"},{"$ref":"#/components/schemas/SignEndUserSolMessageRule"},{"$ref":"#/components/schemas/SendEndUserEvmAssetRule"},{"$ref":"#/components/schemas/SendEndUserSolAssetRule"},{"$ref":"#/components/schemas/SendEndUserOperationRule"},{"$ref":"#/components/schemas/CreateEndUserEvmSwapRule"}],"example":{"action":"accept","operation":"signEvmTransaction","criteria":[{"type":"ethValue","ethValue":"1000000","operator":">="},{"type":"evmAddress","addresses":["0x742d35Cc6634C0532925a3b844Bc454e4438f44e"],"operator":"in"}]}},"Policy":{"type":"object","properties":{"id":{"type":"string","description":"The unique identifier for the policy.","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","example":"123e4567-e89b-12d3-a456-426614174000"},"description":{"type":"string","description":"An optional human-readable description of the policy.\nPolicy descriptions can consist of alphanumeric characters, spaces, commas, and periods, and be 50 characters or less.","pattern":"^[A-Za-z0-9 ,.]{1,50}$","example":"Default policy"},"scope":{"type":"string","description":"The scope of the policy. Only one project-level policy can exist at any time.","enum":["project","account"],"example":"project"},"rules":{"type":"array","description":"A list of rules that comprise the policy.","items":{"$ref":"#/components/schemas/Rule"},"example":[{"action":"accept","operation":"signEvmTransaction","criteria":[{"type":"ethValue","ethValue":"1000000000000000000","operator":"<="},{"type":"evmAddress","addresses":["0x742d35Cc6634C0532925a3b844Bc454e4438f44e","0x1234567890123456789012345678901234567890"],"operator":"in"}]},{"action":"accept","operation":"signSolTransaction","criteria":[{"type":"solAddress","addresses":["HpabPRRCFbBKSuJr5PdkVvQc85FyxyTWkFM2obBRSvHT"],"operator":"in"}]}]},"createdAt":{"type":"string","description":"The ISO 8601 timestamp at which the Policy was created.","example":"2025-03-25T12:00:00Z"},"updatedAt":{"type":"string","description":"The ISO 8601 timestamp at which the Policy was last updated.","example":"2025-03-26T12:00:00Z"}},"required":["id","scope","rules","createdAt","updatedAt"]},"SolanaAccount":{"type":"object","properties":{"address":{"type":"string","pattern":"^[1-9A-HJ-NP-Za-km-z]{32,44}$","description":"The base58 encoded Solana address.","example":"HpabPRRCFbBKSuJr5PdkVvQc85FyxyTWkFM2obBRSvHT"},"name":{"type":"string","description":"An optional name for the account.\nAccount names can consist of alphanumeric characters and hyphens, and be between 2 and 36 characters long.\nAccount names are guaranteed to be unique across all Solana accounts in the developer's CDP Project.","example":"my-account","pattern":"^[A-Za-z0-9][A-Za-z0-9-]{0,34}[A-Za-z0-9]$"},"policies":{"type":"array","x-audience":"public","description":"The list of policy IDs that apply to the account. This will include both the project-level policy and the account-level policy, if one exists.","items":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"example":["123e4567-e89b-12d3-a456-426614174000"]},"createdAt":{"type":"string","description":"The ISO 8601 UTC timestamp at which the account was created.","example":"2025-03-25T12:00:00Z","format":"date-time"},"updatedAt":{"type":"string","description":"The ISO 8601 UTC timestamp at which the account was last updated.","example":"2025-03-26T12:00:00Z","format":"date-time"}},"required":["address"]},"ListSolanaTokenBalancesNetwork":{"type":"string","enum":["solana","solana-devnet"],"description":"The name of the supported Solana networks in human-readable format.","example":"solana"},"SolanaTokenAmount":{"type":"object","description":"Amount of a given Solana token.","example":{"amount":"1250000000","decimals":9},"properties":{"amount":{"type":"string","pattern":"^[0-9]+$","description":"The amount is denominated in the smallest indivisible unit of the token. For SOL, the smallest indivisible unit is lamports (10^-9 SOL). For SPL tokens, the smallest unit is defined by the token's decimals configuration.","example":"1250000000"},"decimals":{"type":"integer","format":"int64","description":"'decimals' is the exponential value N that satisfies the equation `amount * 10^-N = standard_denomination`. The standard denomination is the most commonly used denomination for the token.\n- For native SOL, `decimals` is 9 (1 SOL = 10^9 lamports). - For SPL tokens, `decimals` is defined in the token's mint configuration.","example":9}},"required":["amount","decimals"]},"SolanaToken":{"type":"object","description":"General information about a Solana token. Includes the mint address, and other identifying information.","example":{"symbol":"SOL","name":"Solana","mintAddress":"So11111111111111111111111111111111111111111"},"properties":{"symbol":{"type":"string","description":"The symbol of this token (ex: SOL, USDC, RAY).\nThe token symbol is not unique. It is possible for two different tokens to have the same symbol.\nFor the native SOL token, this symbol is \"SOL\". For SPL tokens, this symbol is defined in the token's metadata.\nNot all tokens have a symbol. This field will only be populated when the token has metadata available.","example":"SOL"},"name":{"type":"string","description":"The name of this token (ex: \"Solana\", \"USD Coin\", \"Raydium\").\nThe token name is not unique. It is possible for two different tokens to have the same name.\nFor the native SOL token, this name is \"Solana\". For SPL tokens, this name is defined in the token's metadata.\nNot all tokens have a name. This field will only be populated when the token has metadata available.","example":"Solana"},"mintAddress":{"type":"string","pattern":"^[1-9A-HJ-NP-Za-km-z]{32,44}$","description":"The mint address of the token.\nFor native SOL, the mint address is `So11111111111111111111111111111111111111111`. For SPL tokens, this is the mint address where the token is defined.","example":"So11111111111111111111111111111111111111111"}},"required":["mintAddress"]},"SolanaTokenBalance":{"type":"object","properties":{"amount":{"$ref":"#/components/schemas/SolanaTokenAmount"},"token":{"$ref":"#/components/schemas/SolanaToken"}},"required":["amount","token"]},"OnchainDataQuery":{"type":"object","description":"Request to execute a SQL query against indexed blockchain data.","required":["sql"],"properties":{"sql":{"type":"string","description":"SQL query to execute against the indexed blockchain data.","example":"SELECT block_number, transaction_hash FROM base.transactions WHERE block_number > 1000000 LIMIT 10","minLength":1,"maxLength":100000},"cache":{"type":"object","title":"Query result cache configuration","description":"Enables control over how often queries need to be fully re-executed on the backing store.\nThis can be useful in scenarios where API calls might be made frequently, API latency is critical, and some freshness lag (ex: 750ms, 2s, 5s) is tolerable.\nBy default, each query result is returned from cache so long as the result is from an identical query and less than 500ms old. This freshness tolerance can be modified upwards, to a maximum of 900000ms (i.e. 900s, 15m).\n","example":{"maxAgeMs":1000},"properties":{"maxAgeMs":{"type":"integer","description":"The maximum tolerable staleness of the query result cache in milliseconds. If a previous execution result of an identical query is older than this age, the query will be re-executed. If the data is less than this age, the result will be returned from cache.","example":1000,"default":500,"minimum":500,"maximum":900000}}}}},"OnchainDataResult":{"type":"object","description":"Result of executing a SQL query.","properties":{"result":{"type":"array","description":"Query result as an array of objects representing rows.","items":{"type":"object","additionalProperties":true,"description":"Row data with column names as keys.","example":{"event_signature":"Transfer(address,address,uint256)","from":"0x1234567890abcdef","to":"0x1234567890abcdef","amount":1000000000000000000}},"example":[{"event_signature":"Transfer(address,address,uint256)","from":"0x1234567890abcdef","to":"0x1234567890abcdef","amount":1000000000000000000},{"event_signature":"Transfer(address,address,uint256)","from":"0x1234567890abcdef","to":"0x1234567890abcdef","amount":2000000000000000000}]},"schema":{"type":"object","description":"Schema information for the query result. This is a derived schema from the query result, so types may not match the underlying table.\n","example":{"columns":[{"name":"block_number","type":"UInt64"},{"name":"transaction_hash","type":"String"}]},"properties":{"columns":{"type":"array","description":"Column definitions.","items":{"type":"object","properties":{"name":{"type":"string","description":"Column name."},"type":{"type":"string","description":"Column data type (ClickHouse types).","enum":["String","UInt8","UInt16","UInt32","UInt64","UInt128","UInt256","Int8","Int16","Int32","Int64","Int128","Int256","Float32","Float64","Bool","Date","DateTime","DateTime64","UUID"]}},"example":{"name":"event_signature","type":"String","description":"The signature of the event."}}}}},"metadata":{"type":"object","description":"Metadata about query execution.","properties":{"cached":{"type":"boolean","description":"Whether the result was served from the query result cache.","example":false},"executionTimestamp":{"type":"string","description":"When the query result was executed against the backing store in RFC 3339 format.","format":"date-time","example":"2025-01-01T00:00:00.000Z"},"executionTimeMs":{"type":"integer","description":"Query execution time in milliseconds.","example":145},"rowCount":{"type":"integer","description":"Number of rows returned.","example":2}},"example":{"cached":false,"executionTimestamp":"2025-01-01T00:00:00.000Z","executionTimeMs":145,"rowCount":2}}}},"OnchainDataColumnSchema":{"type":"object","description":"Schema definition for a table column.","properties":{"name":{"type":"string","description":"Column name.","example":"event_signature"},"type":{"type":"string","description":"Column data type.","example":"String"},"nullable":{"type":"boolean","description":"Whether this column can contain NULL values.","example":false},"description":{"allOf":[{"$ref":"#/components/schemas/Description"}],"description":"Human-readable description of the column.","example":"The signature of the decoded event log."},"indexOrder":{"type":"integer","description":"The order of the column in the index. A lower number means the column is more important for the index and should be first in the query.","example":0}},"example":{"name":"event_signature","type":"String","nullable":false,"description":"The signature of the decoded event log.","indexOrder":0}},"OnchainDataTableSchema":{"type":"object","description":"Schema definition for a data table.","properties":{"database":{"type":"string","description":"The blockchain network database this table belongs to.","example":"base"},"table":{"type":"string","description":"Table name.","example":"events"},"columns":{"type":"array","description":"Column definitions for this table.","items":{"$ref":"#/components/schemas/OnchainDataColumnSchema"},"example":[{"name":"event_signature","type":"String","nullable":false,"description":"The signature of the decoded event log.","indexOrder":0}]}},"example":{"database":"base","table":"events","columns":[{"name":"event_signature","type":"String","nullable":false,"description":"The signature of the decoded event log.","indexOrder":0},{"name":"address","type":"String","nullable":false,"description":"The address of the smart contract that emitted the event log.","indexOrder":1}]}},"OnchainDataSchemaResponse":{"type":"object","description":"Schema information for available blockchain data tables.","properties":{"tables":{"type":"array","description":"List of available tables.","items":{"$ref":"#/components/schemas/OnchainDataTableSchema"},"example":[{"database":"base","table":"events","columns":[{"name":"event_signature","type":"String","nullable":false,"description":"The signature of the decoded event log.","indexOrder":0}]}]}}},"AccountTokenAddressesResponse":{"type":"object","description":"Response containing token addresses that an account has received.","properties":{"accountAddress":{"type":"string","description":"The account address that was queried.","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"},"tokenAddresses":{"type":"array","description":"List of token contract addresses that the account has received.","items":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"Token contract address."},"example":["0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","0x4200000000000000000000000000000000000006","0x0000000000000000000000000000000000000000"]},"totalCount":{"type":"integer","description":"Total number of unique token addresses discovered.","example":15,"minimum":0}}},"EventType":{"type":"string","description":"A webhook event type identifier following dot-separated format:\n`<domain>.<entity>.<verb>` (e.g., \"onchain.activity.detected\").\n","example":"onchain.activity.detected","enum":["onchain.activity.detected","wallet.activity.detected","wallet.activity.multi","wallet.transaction.created","wallet.transaction.signed","wallet.transaction.broadcast","wallet.transaction.replaced","wallet.transaction.pending","wallet.transaction.confirmed","wallet.transaction.failed","wallet.delegation.created","wallet.delegation.revoked","wallet.typed_data.signed","wallet.message.signed","wallet.hash.signed","payments.transfers.quoted","payments.transfers.processing","payments.transfers.completed","payments.transfers.failed","payments.transfers.expired","payments.transfers.travel_rule_incomplete","payments.transfers.travel_rule_completed","onramp.transaction.created","onramp.transaction.updated","onramp.transaction.success","onramp.transaction.failed","offramp.transaction.created","offramp.transaction.updated","offramp.transaction.success","offramp.transaction.failed","customers.capability.changed","customers.customer.deleted"]},"WebhookTarget":{"type":"object","description":"Target configuration for webhook delivery.\nSpecifies the destination URL and any custom headers to include in webhook requests.\n","required":["url"],"properties":{"url":{"allOf":[{"$ref":"#/components/schemas/Url"}],"description":"The webhook URL to deliver events to.","example":"https://api.example.com/webhooks"},"headers":{"type":"object","description":"Additional headers to include in webhook requests.","additionalProperties":{"type":"string"},"example":{"Authorization":"Bearer token123","Content-Type":"application/json"}}},"example":{"url":"https://api.example.com/webhooks","headers":{"Authorization":"Bearer token123","Content-Type":"application/json"}}},"WebhookSubscriptionResponse":{"type":"object","description":"Response containing webhook subscription details.","required":["subscriptionId","eventTypes","isEnabled","secret","target","createdAt"],"properties":{"createdAt":{"type":"string","format":"date-time","description":"When the subscription was created.","example":"2025-01-15T10:30:00Z"},"updatedAt":{"type":"string","format":"date-time","description":"When the subscription was last updated.","example":"2025-01-16T14:00:00Z"},"description":{"allOf":[{"$ref":"#/components/schemas/Description"}],"description":"Description of the webhook subscription.","example":"Subscription for token transfer events"},"eventTypes":{"type":"array","description":"Types of events to subscribe to. Event types follow a dot-separated format:\nservice.resource.verb (e.g., \"onchain.activity.detected\", \"wallet.activity.detected\", \"onramp.transaction.created\",\n\"acceptance.payment_session.authorization_succeeded\").\n","items":{"$ref":"#/components/schemas/EventType"},"example":["onchain.activity.detected"]},"isEnabled":{"type":"boolean","description":"Whether the subscription is enabled.","example":true},"metadata":{"allOf":[{"$ref":"#/components/schemas/Metadata"},{"type":"object","properties":{"secret":{"type":"string","format":"uuid","deprecated":true,"description":"Use the root-level `secret` field instead. Maintained for backward compatibility only.","example":"123e4567-e89b-12d3-a456-426614174000"}}}],"description":"Additional metadata for the subscription.","example":{"secret":"123e4567-e89b-12d3-a456-426614174000"}},"secret":{"type":"string","format":"uuid","description":"Secret for webhook signature validation.","example":"123e4567-e89b-12d3-a456-426614174000"},"subscriptionId":{"type":"string","format":"uuid","description":"Unique identifier for the subscription.","example":"123e4567-e89b-12d3-a456-426614174000"},"target":{"$ref":"#/components/schemas/WebhookTarget"},"labels":{"type":"object","description":"Multi-label filters using total overlap logic. Total overlap means the subscription only triggers when events contain ALL these key-value pairs.\nPresent when subscription uses multi-label format.\n","additionalProperties":{"type":"string"},"example":{"env":"dev","team":"payments","contract_address":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}}},"example":{"subscriptionId":"123e4567-e89b-12d3-a456-426614174000","eventTypes":["onchain.activity.detected"],"isEnabled":true,"labels":{"contract_address":"0x833589fcd6edb6e08f4c7c32d4f71b54bda02913","event_name":"Transfer","network":"base-mainnet","transaction_to":"0xf5042e6ffac5a625d4e7848e0b01373d8eb9e222"},"description":"USDC Transfer events to specific address.","createdAt":"2025-11-12T09:19:52.051Z","updatedAt":"2025-11-13T11:30:00.000Z","metadata":{"secret":"a1b2c3d4-e5f6-7890-abcd-ef1234567890"},"secret":"a1b2c3d4-e5f6-7890-abcd-ef1234567890","target":{"url":"https://api.example.com/webhooks"}}},"WebhookSubscriptionListResponse":{"allOf":[{"type":"object","description":"Response containing a list of webhook subscriptions.","required":["subscriptions"],"properties":{"subscriptions":{"type":"array","description":"The list of webhook subscriptions.","items":{"$ref":"#/components/schemas/WebhookSubscriptionResponse"}}}},{"$ref":"#/components/schemas/ListResponse"}]},"WebhookSubscriptionRequest":{"type":"object","description":"Request to create a new webhook subscription with support for multi-label filtering.\n","properties":{"description":{"allOf":[{"$ref":"#/components/schemas/Description"}],"description":"Description of the webhook subscription.","example":"Subscription for token transfer events"},"eventTypes":{"type":"array","description":"Types of events to subscribe to. Event types follow a dot-separated format:\nservice.resource.verb (e.g., \"onchain.activity.detected\", \"wallet.activity.detected\", \"onramp.transaction.created\",\n\"acceptance.payment_session.authorization_succeeded\").\nThe subscription will only receive events matching these types AND the label filter(s).\n","items":{"$ref":"#/components/schemas/EventType"},"example":["onchain.activity.detected"]},"isEnabled":{"type":"boolean","description":"Whether the subscription is enabled.","example":true},"target":{"$ref":"#/components/schemas/WebhookTarget"},"metadata":{"$ref":"#/components/schemas/Metadata"},"labels":{"type":"object","description":"Optional. Multi-label filters using total overlap logic. Total overlap means the subscription will only trigger when\nan event contains ALL the key-value pairs specified here. Additional labels on\nthe event are allowed and will not prevent matching. Omit to receive all events for the selected event types.\n\n**Note:** Currently, labels are supported for onchain webhooks only (max 20 labels per subscription).\n\n**Allowed labels for `onchain.activity.detected`** (all in snake_case format):\n- `network` (required) — Blockchain network\n- `contract_address` — Smart contract address\n- `event_name` — Event name (e.g., \"Transfer\", \"Burn\")\n- `event_signature` — Event signature hash\n- `transaction_from` — Transaction sender address\n- `transaction_to` — Transaction recipient address\n- `params.*` — Any event parameter (e.g., `params.from`, `params.to`, `params.sender`, `params.tokenId`)\n","additionalProperties":{"type":"string"},"examples":[{"network":"base-mainnet","contract_address":"0xcd1f9777571493aeacb7eae45cd30a226d3e612d","event_name":"Burn"},{"network":"base-mainnet","contract_address":"0xbac4a9428ea707c51f171ed9890c3c2fa810305d","event_name":"PriceUpdated"},{"network":"base-mainnet","contract_address":"0x45c6e6a47a711b14d8357d5243f46704904578e3","event_name":"Deposit"}]}},"required":["eventTypes","isEnabled","target"]},"WebhookSubscriptionUpdateRequest":{"type":"object","description":"Request to update an existing webhook subscription.\n","properties":{"description":{"allOf":[{"$ref":"#/components/schemas/Description"}],"description":"Description of the webhook subscription.","example":"Updated subscription for token transfer events"},"eventTypes":{"type":"array","description":"Types of events to subscribe to. Event types follow a three-part dot-separated format:\nservice.resource.verb (e.g., \"onchain.activity.detected\", \"wallet.activity.detected\", \"onramp.transaction.created\").\n","items":{"$ref":"#/components/schemas/EventType"},"example":["onchain.activity.detected"]},"isEnabled":{"type":"boolean","description":"Whether the subscription is enabled.","example":false},"target":{"$ref":"#/components/schemas/WebhookTarget"},"metadata":{"$ref":"#/components/schemas/Metadata"},"labels":{"type":"object","description":"Optional. Multi-label filters that trigger only when an event contains ALL of these key-value pairs.\nOmit to receive all events for the selected event types.\n\n**Note:** Currently, labels are supported for onchain webhooks only (max 20 labels per subscription).\n\n**Allowed labels for `onchain.activity.detected`** (all in snake_case format):\n- `network` (required) — Blockchain network\n- `contract_address` — Smart contract address\n- `event_name` — Event name (e.g., \"Transfer\", \"Burn\")\n- `event_signature` — Event signature hash\n- `transaction_from` — Transaction sender address\n- `transaction_to` — Transaction recipient address\n- `params.*` — Any event parameter (e.g., `params.from`, `params.to`, `params.sender`, `params.tokenId`)\n","additionalProperties":{"type":"string"},"examples":[{"network":"base-mainnet","contract_address":"0xcd1f9777571493aeacb7eae45cd30a226d3e612d","event_name":"Burn"},{"network":"base-mainnet","contract_address":"0xbac4a9428ea707c51f171ed9890c3c2fa810305d","event_name":"PriceUpdated"},{"network":"base-mainnet","contract_address":"0x45c6e6a47a711b14d8357d5243f46704904578e3","event_name":"Deposit"}]}},"required":["eventTypes","isEnabled","target"]},"WebhookEventResponseDetail":{"type":"object","description":"Details of the HTTP response received from the webhook target.","properties":{"httpCode":{"type":"integer","description":"HTTP status code returned by the webhook target.","example":200},"elapsedTimeMs":{"type":"integer","description":"Round-trip time of the webhook delivery in milliseconds.","example":142},"body":{"type":"string","description":"Response body returned by the webhook target.","example":"ok"},"errorName":{"type":"string","description":"Error name if the delivery failed (e.g., timeout, connection_refused).","example":"timeout"}},"example":{"httpCode":200,"elapsedTimeMs":142,"body":"ok"}},"WebhookEventResponse":{"type":"object","description":"Details of a webhook event delivery attempt for a subscription.","required":["eventId","eventTypeName","status","createdAt","retryCount"],"properties":{"eventId":{"type":"string","description":"Unique identifier for the webhook event.","example":"a1b2c3d4-e5f6-7890-abcd-ef1234567890"},"eventTypeName":{"type":"string","description":"The type of event that was delivered (e.g., \"onchain.activity.detected\").","example":"onchain.activity.detected"},"status":{"type":"string","description":"Current delivery status of the event.","enum":["pending","processing","succeeded","failed","retrying"],"example":"succeeded"},"createdAt":{"type":"string","format":"date-time","description":"Timestamp when the event delivery attempt was created.","example":"2025-01-15T10:30:00Z"},"succeededAt":{"type":"string","format":"date-time","description":"Timestamp when the event was successfully delivered. Only present if status is \"succeeded\".","example":"2025-01-15T10:30:02Z"},"retryCount":{"type":"integer","description":"Number of delivery retry attempts so far.","example":0},"response":{"$ref":"#/components/schemas/WebhookEventResponseDetail"}},"example":{"eventId":"a1b2c3d4-e5f6-7890-abcd-ef1234567890","eventTypeName":"onchain.activity.detected","status":"succeeded","createdAt":"2025-01-15T10:30:00Z","succeededAt":"2025-01-15T10:30:02Z","retryCount":0,"response":{"httpCode":200,"elapsedTimeMs":142,"body":"ok"}}},"WebhookEventListResponse":{"type":"object","description":"Response containing a list of webhook event delivery attempts.","required":["events"],"properties":{"events":{"type":"array","description":"The list of webhook event delivery attempts.","items":{"$ref":"#/components/schemas/WebhookEventResponse"}}},"example":{"events":[{"eventId":"a1b2c3d4-e5f6-7890-abcd-ef1234567890","eventTypeName":"onchain.activity.detected","status":"succeeded","createdAt":"2025-01-15T10:30:00Z","succeededAt":"2025-01-15T10:30:02Z","retryCount":0,"response":{"httpCode":200,"elapsedTimeMs":142,"body":"ok"}}]}},"x402VerifyInvalidReason":{"type":"string","description":"The reason the payment is invalid on the x402 protocol.","enum":["insufficient_funds","invalid_scheme","invalid_network","invalid_x402_version","invalid_payment_requirements","invalid_payload","invalid_exact_evm_payload_authorization_value","invalid_exact_evm_payload_authorization_value_too_low","invalid_exact_evm_payload_authorization_valid_after","invalid_exact_evm_payload_authorization_valid_before","invalid_exact_evm_payload_authorization_typed_data_message","invalid_exact_evm_payload_authorization_from_address_kyt","invalid_exact_evm_payload_authorization_to_address_kyt","invalid_exact_evm_payload_signature","invalid_exact_evm_payload_signature_address","invalid_exact_evm_permit2_payload_allowance_required","invalid_exact_evm_permit2_payload_signature","invalid_exact_evm_permit2_payload_deadline","invalid_exact_evm_permit2_payload_valid_after","invalid_exact_evm_permit2_payload_spender","invalid_exact_evm_permit2_payload_recipient","invalid_exact_evm_permit2_payload_amount","invalid_exact_svm_payload_transaction","invalid_exact_svm_payload_transaction_amount_mismatch","invalid_exact_svm_payload_transaction_create_ata_instruction","invalid_exact_svm_payload_transaction_create_ata_instruction_incorrect_payee","invalid_exact_svm_payload_transaction_create_ata_instruction_incorrect_asset","invalid_exact_svm_payload_transaction_instructions","invalid_exact_svm_payload_transaction_instructions_length","invalid_exact_svm_payload_transaction_instructions_compute_limit_instruction","invalid_exact_svm_payload_transaction_instructions_compute_price_instruction","invalid_exact_svm_payload_transaction_instructions_compute_price_instruction_too_high","invalid_exact_svm_payload_transaction_instruction_not_spl_token_transfer_checked","invalid_exact_svm_payload_transaction_instruction_not_token_2022_transfer_checked","invalid_exact_svm_payload_transaction_not_a_transfer_instruction","invalid_exact_svm_payload_transaction_cannot_derive_receiver_ata","invalid_exact_svm_payload_transaction_receiver_ata_not_found","invalid_exact_svm_payload_transaction_sender_ata_not_found","invalid_exact_svm_payload_transaction_simulation_failed","invalid_exact_svm_payload_transaction_transfer_to_incorrect_ata","invalid_exact_svm_payload_transaction_fee_payer_included_in_instruction_accounts","invalid_exact_svm_payload_transaction_fee_payer_transferring_funds","invalid_batch_settlement_evm_scheme","invalid_batch_settlement_evm_network_mismatch","invalid_batch_settlement_evm_payload_type","invalid_batch_settlement_evm_channel_not_found","invalid_batch_settlement_evm_deposit_simulation_failed","invalid_batch_settlement_evm_channel_id_mismatch","invalid_batch_settlement_evm_channel_state_read_failed","invalid_batch_settlement_evm_cumulative_below_claimed","invalid_batch_settlement_evm_cumulative_exceeds_balance","invalid_batch_settlement_evm_eip2612_amount_mismatch","invalid_batch_settlement_evm_eip2612_asset_mismatch","invalid_batch_settlement_evm_eip2612_deadline_expired","invalid_batch_settlement_evm_eip2612_invalid_format","invalid_batch_settlement_evm_eip2612_invalid_signature","invalid_batch_settlement_evm_eip2612_owner_mismatch","invalid_batch_settlement_evm_eip2612_spender_mismatch","invalid_batch_settlement_evm_erc20_approval_asset_mismatch","invalid_batch_settlement_evm_erc20_approval_from_mismatch","invalid_batch_settlement_evm_erc20_approval_invalid_format","invalid_batch_settlement_evm_erc20_approval_unavailable","invalid_batch_settlement_evm_erc20_approval_wrong_spender","invalid_batch_settlement_evm_erc3009_authorization_required","invalid_batch_settlement_evm_insufficient_balance","invalid_batch_settlement_evm_deposit_payload","invalid_batch_settlement_evm_receive_authorization_signature","invalid_batch_settlement_evm_refund_payload","invalid_batch_settlement_evm_voucher_payload","invalid_batch_settlement_evm_voucher_signature","invalid_batch_settlement_evm_missing_eip712_domain","invalid_batch_settlement_evm_payload_authorization_valid_after","invalid_batch_settlement_evm_payload_authorization_valid_before","invalid_batch_settlement_evm_permit2_allowance_required","invalid_batch_settlement_evm_permit2_amount_mismatch","invalid_batch_settlement_evm_permit2_authorization_required","invalid_batch_settlement_evm_permit2_deadline_expired","invalid_batch_settlement_evm_permit2_invalid_signature","invalid_batch_settlement_evm_permit2_invalid_spender","invalid_batch_settlement_evm_receiver_authorizer_mismatch","invalid_batch_settlement_evm_receiver_mismatch","invalid_batch_settlement_evm_rpc_read_failed","invalid_batch_settlement_evm_token_mismatch","invalid_batch_settlement_evm_withdraw_delay_mismatch","invalid_batch_settlement_evm_withdraw_delay_out_of_range","invalid_exact_evm_scheme","invalid_exact_evm_network_mismatch","invalid_exact_evm_payload","invalid_exact_evm_payload_missing_signature","invalid_exact_evm_failed_to_get_network_config","invalid_exact_evm_missing_eip712_domain","invalid_exact_evm_recipient_mismatch","invalid_exact_evm_authorization_value","invalid_exact_evm_required_amount","invalid_exact_evm_payload_authorization_value_mismatch","invalid_exact_evm_failed_to_check_nonce","invalid_exact_evm_nonce_already_used","invalid_exact_evm_failed_to_get_balance","invalid_exact_evm_insufficient_balance","invalid_exact_evm_signature_format","invalid_exact_evm_failed_to_verify_signature","invalid_exact_evm_signature","invalid_exact_evm_token_name_mismatch","invalid_exact_evm_token_version_mismatch","invalid_exact_evm_eip3009_not_supported","invalid_exact_evm_transaction_simulation_failed","invalid_exact_evm_verification_failed","invalid_exact_evm_failed_to_parse_signature","invalid_exact_evm_failed_to_check_deployment","invalid_exact_evm_failed_to_execute_transfer","invalid_exact_evm_failed_to_get_receipt","invalid_exact_evm_transaction_failed","invalid_exact_evm_payload_undeployed_smart_wallet","smart_wallet_deployment_failed","unsupported_payload_type","invalid_erc20_approval_extension_format","erc20_approval_tx_failed","erc20_approval_from_mismatch","erc20_approval_asset_mismatch","erc20_approval_spender_not_permit2","erc20_approval_tx_parse_failed","erc20_approval_tx_wrong_target","erc20_approval_tx_wrong_selector","erc20_approval_tx_wrong_spender","erc20_approval_tx_signer_mismatch","erc20_approval_tx_invalid_signature","invalid_exact_evm_unsupported_scheme","invalid_exact_evm_extra_field","invalid_exact_evm_payload_recipient_mismatch","invalid_exact_evm_insufficient_funds","invalid_exact_evm_transaction_state","invalid_permit2_spender","invalid_permit2_recipient_mismatch","permit2_deadline_expired","permit2_not_yet_valid","permit2_amount_mismatch","permit2_token_mismatch","invalid_permit2_signature","permit2_allowance_required","permit2_invalid_amount","permit2_invalid_destination","permit2_invalid_owner","permit2_payment_too_early","permit2_invalid_nonce","permit2_2612_amount_mismatch","permit2_simulation_failed","permit2_insufficient_balance","permit2_proxy_not_deployed","erc20_approval_insufficient_eth_for_gas","erc20_approval_broadcast_failed","invalid_exact_solana_unsupported_scheme","invalid_exact_solana_network_mismatch","invalid_exact_solana_payload_missing_fee_payer","invalid_exact_solana_fee_payer_not_managed_by_facilitator","invalid_exact_solana_payload_transaction","invalid_exact_solana_payload_transaction_could_not_be_decoded","invalid_exact_solana_payload_transaction_instructions_length","invalid_exact_solana_payload_unknown_fourth_instruction","invalid_exact_solana_payload_unknown_fifth_instruction","invalid_exact_solana_payload_unknown_sixth_instruction","invalid_exact_solana_payload_transaction_instructions_compute_limit_instruction","invalid_exact_solana_payload_transaction_instructions_compute_price_instruction","invalid_exact_solana_payload_transaction_instructions_compute_price_instruction_too_high","invalid_exact_solana_payload_no_transfer_instruction","invalid_exact_solana_payload_transaction_fee_payer_transferring_funds","invalid_exact_solana_payload_mint_mismatch","invalid_exact_solana_payload_recipient_mismatch","invalid_exact_solana_payload_amount_insufficient","invalid_exact_solana_invalid_fee_payer","invalid_exact_solana_transaction_signing_failed","invalid_exact_solana_transaction_simulation_failed","invalid_exact_solana_payload_memo_mismatch","invalid_exact_solana_payload_memo_count","invalid_exact_solana_verification_failed","invalid_exact_solana_fee_payer_mismatch","invalid_exact_solana_transaction_failed","invalid_exact_solana_transaction_confirmation_failed","duplicate_settlement","invalid_exact_solana_extra_field","batch_settlement_cumulative_amount_mismatch","batch_settlement_channel_busy","missing_batch_settlement_channel","batch_settlement_charge_exceeds_signed_cumulative","batch_settlement_refund_no_balance","batch_settlement_refund_amount_invalid","batch_settlement_refund_amount_exceeds_balance","amount_too_low","invalid_amount","kyt_risk_detected","permit2_disabled","preflight_validation_failed","request_blocked_by_location","self_send_not_allowed","invalid_bazaar_extension","unknown_error"],"example":"insufficient_funds"},"x402VerifyPaymentRejection":{"type":"object","description":"The result when x402 payment verification fails.","properties":{"isValid":{"type":"boolean","description":"Indicates whether the payment is valid.","example":false},"invalidReason":{"$ref":"#/components/schemas/x402VerifyInvalidReason"},"invalidMessage":{"type":"string","description":"The message describing the invalid reason.","example":"Insufficient funds"},"payer":{"allOf":[{"$ref":"#/components/schemas/BlockchainAddress"}],"description":"The onchain address of the client that is paying for the resource.\n\nFor EVM networks, the payer will be a 0x-prefixed, checksum EVM address.\n\nFor Solana-based networks, the payer will be a base58-encoded Solana address.","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"}},"required":["isValid","invalidReason"],"example":{"isValid":false,"invalidReason":"insufficient_funds","invalidMessage":"Insufficient funds","payer":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"}},"x402SettleErrorReason":{"type":"string","description":"The reason the payment settlement errored on the x402 protocol.","enum":["insufficient_funds","invalid_scheme","invalid_network","invalid_x402_version","invalid_payment_requirements","invalid_payload","invalid_exact_evm_payload_authorization_value","invalid_exact_evm_payload_authorization_value_too_low","invalid_exact_evm_payload_authorization_valid_after","invalid_exact_evm_payload_authorization_valid_before","invalid_exact_evm_payload_authorization_typed_data_message","invalid_exact_evm_payload_authorization_from_address_kyt","invalid_exact_evm_payload_authorization_to_address_kyt","invalid_exact_evm_payload_signature","invalid_exact_evm_payload_signature_address","invalid_exact_evm_permit2_payload_allowance_required","invalid_exact_evm_permit2_payload_signature","invalid_exact_evm_permit2_payload_deadline","invalid_exact_evm_permit2_payload_valid_after","invalid_exact_evm_permit2_payload_spender","invalid_exact_evm_permit2_payload_recipient","invalid_exact_evm_permit2_payload_amount","invalid_exact_svm_payload_transaction","invalid_exact_svm_payload_transaction_amount_mismatch","invalid_exact_svm_payload_transaction_create_ata_instruction","invalid_exact_svm_payload_transaction_create_ata_instruction_incorrect_payee","invalid_exact_svm_payload_transaction_create_ata_instruction_incorrect_asset","invalid_exact_svm_payload_transaction_instructions","invalid_exact_svm_payload_transaction_instructions_length","invalid_exact_svm_payload_transaction_instructions_compute_limit_instruction","invalid_exact_svm_payload_transaction_instructions_compute_price_instruction","invalid_exact_svm_payload_transaction_instructions_compute_price_instruction_too_high","invalid_exact_svm_payload_transaction_instruction_not_spl_token_transfer_checked","invalid_exact_svm_payload_transaction_instruction_not_token_2022_transfer_checked","invalid_exact_svm_payload_transaction_not_a_transfer_instruction","invalid_exact_svm_payload_transaction_cannot_derive_receiver_ata","invalid_exact_svm_payload_transaction_receiver_ata_not_found","invalid_exact_svm_payload_transaction_sender_ata_not_found","invalid_exact_svm_payload_transaction_simulation_failed","invalid_exact_svm_payload_transaction_transfer_to_incorrect_ata","invalid_exact_svm_payload_transaction_fee_payer_included_in_instruction_accounts","invalid_exact_svm_payload_transaction_fee_payer_transferring_funds","settle_exact_evm_transaction_confirmation_timed_out","settle_exact_node_failure","settle_exact_failed_onchain","settle_exact_svm_block_height_exceeded","settle_exact_svm_transaction_confirmation_timed_out","invalid_batch_settlement_evm_unknown_settle_action","invalid_batch_settlement_evm_claim_payload","invalid_batch_settlement_evm_settle_payload","invalid_batch_settlement_evm_authorizer_address_mismatch","invalid_batch_settlement_evm_claim_simulation_failed","invalid_batch_settlement_evm_claim_transaction_failed","invalid_batch_settlement_evm_deposit_transaction_failed","invalid_batch_settlement_evm_refund_simulation_failed","invalid_batch_settlement_evm_refund_transaction_failed","invalid_batch_settlement_evm_settle_simulation_failed","invalid_batch_settlement_evm_settle_transaction_failed","invalid_batch_settlement_evm_transaction_reverted","invalid_batch_settlement_evm_wait_for_receipt_failed","invalid_batch_settlement_evm_erc20_approval_broadcast_failed","invalid_batch_settlement_evm_channel_id_mismatch","invalid_batch_settlement_evm_channel_state_read_failed","invalid_batch_settlement_evm_cumulative_below_claimed","invalid_batch_settlement_evm_cumulative_exceeds_balance","invalid_batch_settlement_evm_eip2612_amount_mismatch","invalid_batch_settlement_evm_eip2612_asset_mismatch","invalid_batch_settlement_evm_eip2612_deadline_expired","invalid_batch_settlement_evm_eip2612_invalid_format","invalid_batch_settlement_evm_eip2612_invalid_signature","invalid_batch_settlement_evm_eip2612_owner_mismatch","invalid_batch_settlement_evm_eip2612_spender_mismatch","invalid_batch_settlement_evm_erc20_approval_asset_mismatch","invalid_batch_settlement_evm_erc20_approval_from_mismatch","invalid_batch_settlement_evm_erc20_approval_invalid_format","invalid_batch_settlement_evm_erc20_approval_unavailable","invalid_batch_settlement_evm_erc20_approval_wrong_spender","invalid_batch_settlement_evm_erc3009_authorization_required","invalid_batch_settlement_evm_insufficient_balance","invalid_batch_settlement_evm_deposit_payload","invalid_batch_settlement_evm_receive_authorization_signature","invalid_batch_settlement_evm_refund_payload","invalid_batch_settlement_evm_voucher_payload","invalid_batch_settlement_evm_voucher_signature","invalid_batch_settlement_evm_missing_eip712_domain","invalid_batch_settlement_evm_payload_authorization_valid_after","invalid_batch_settlement_evm_payload_authorization_valid_before","invalid_batch_settlement_evm_permit2_allowance_required","invalid_batch_settlement_evm_permit2_amount_mismatch","invalid_batch_settlement_evm_permit2_authorization_required","invalid_batch_settlement_evm_permit2_deadline_expired","invalid_batch_settlement_evm_permit2_invalid_signature","invalid_batch_settlement_evm_permit2_invalid_spender","invalid_batch_settlement_evm_receiver_authorizer_mismatch","invalid_batch_settlement_evm_receiver_mismatch","invalid_batch_settlement_evm_rpc_read_failed","invalid_batch_settlement_evm_token_mismatch","invalid_batch_settlement_evm_withdraw_delay_mismatch","invalid_batch_settlement_evm_withdraw_delay_out_of_range","invalid_batch_settlement_evm_scheme","invalid_batch_settlement_evm_network_mismatch","invalid_batch_settlement_evm_payload_type","invalid_batch_settlement_evm_channel_not_found","invalid_batch_settlement_evm_deposit_simulation_failed","invalid_exact_evm_scheme","invalid_exact_evm_network_mismatch","invalid_exact_evm_payload","invalid_exact_evm_payload_missing_signature","invalid_exact_evm_failed_to_get_network_config","invalid_exact_evm_missing_eip712_domain","invalid_exact_evm_recipient_mismatch","invalid_exact_evm_authorization_value","invalid_exact_evm_required_amount","invalid_exact_evm_payload_authorization_value_mismatch","invalid_exact_evm_failed_to_check_nonce","invalid_exact_evm_nonce_already_used","invalid_exact_evm_failed_to_get_balance","invalid_exact_evm_insufficient_balance","invalid_exact_evm_signature_format","invalid_exact_evm_failed_to_verify_signature","invalid_exact_evm_signature","invalid_exact_evm_token_name_mismatch","invalid_exact_evm_token_version_mismatch","invalid_exact_evm_eip3009_not_supported","invalid_exact_evm_transaction_simulation_failed","invalid_exact_evm_verification_failed","invalid_exact_evm_failed_to_parse_signature","invalid_exact_evm_failed_to_check_deployment","invalid_exact_evm_failed_to_execute_transfer","invalid_exact_evm_failed_to_get_receipt","invalid_exact_evm_transaction_failed","invalid_exact_evm_payload_undeployed_smart_wallet","smart_wallet_deployment_failed","unsupported_payload_type","invalid_erc20_approval_extension_format","erc20_approval_tx_failed","erc20_approval_from_mismatch","erc20_approval_asset_mismatch","erc20_approval_spender_not_permit2","erc20_approval_tx_parse_failed","erc20_approval_tx_wrong_target","erc20_approval_tx_wrong_selector","erc20_approval_tx_wrong_spender","erc20_approval_tx_signer_mismatch","erc20_approval_tx_invalid_signature","invalid_exact_evm_unsupported_scheme","invalid_exact_evm_extra_field","invalid_exact_evm_payload_recipient_mismatch","invalid_exact_evm_insufficient_funds","invalid_exact_evm_transaction_state","invalid_permit2_spender","invalid_permit2_recipient_mismatch","permit2_deadline_expired","permit2_not_yet_valid","permit2_amount_mismatch","permit2_token_mismatch","invalid_permit2_signature","permit2_allowance_required","permit2_invalid_amount","permit2_invalid_destination","permit2_invalid_owner","permit2_payment_too_early","permit2_invalid_nonce","permit2_2612_amount_mismatch","permit2_simulation_failed","permit2_insufficient_balance","permit2_proxy_not_deployed","erc20_approval_insufficient_eth_for_gas","erc20_approval_broadcast_failed","invalid_exact_solana_unsupported_scheme","invalid_exact_solana_network_mismatch","invalid_exact_solana_payload_missing_fee_payer","invalid_exact_solana_fee_payer_not_managed_by_facilitator","invalid_exact_solana_payload_transaction","invalid_exact_solana_payload_transaction_could_not_be_decoded","invalid_exact_solana_payload_transaction_instructions_length","invalid_exact_solana_payload_unknown_fourth_instruction","invalid_exact_solana_payload_unknown_fifth_instruction","invalid_exact_solana_payload_unknown_sixth_instruction","invalid_exact_solana_payload_transaction_instructions_compute_limit_instruction","invalid_exact_solana_payload_transaction_instructions_compute_price_instruction","invalid_exact_solana_payload_transaction_instructions_compute_price_instruction_too_high","invalid_exact_solana_payload_no_transfer_instruction","invalid_exact_solana_payload_transaction_fee_payer_transferring_funds","invalid_exact_solana_payload_mint_mismatch","invalid_exact_solana_payload_recipient_mismatch","invalid_exact_solana_payload_amount_insufficient","invalid_exact_solana_invalid_fee_payer","invalid_exact_solana_transaction_signing_failed","invalid_exact_solana_transaction_simulation_failed","invalid_exact_solana_payload_memo_mismatch","invalid_exact_solana_payload_memo_count","invalid_exact_solana_verification_failed","invalid_exact_solana_fee_payer_mismatch","invalid_exact_solana_transaction_failed","invalid_exact_solana_transaction_confirmation_failed","duplicate_settlement","invalid_exact_solana_extra_field","batch_settlement_cumulative_amount_mismatch","batch_settlement_channel_busy","missing_batch_settlement_channel","batch_settlement_charge_exceeds_signed_cumulative","batch_settlement_refund_no_balance","batch_settlement_refund_amount_invalid","batch_settlement_refund_amount_exceeds_balance","amount_too_low","invalid_amount","kyt_risk_detected","permit2_disabled","preflight_validation_failed","request_blocked_by_location","self_send_not_allowed","invalid_bazaar_extension","unknown_error"],"example":"insufficient_funds"},"x402SettlePaymentRejection":{"type":"object","description":"The result when x402 payment settlement fails.","properties":{"success":{"type":"boolean","description":"Indicates whether the payment settlement is successful.","example":false},"errorReason":{"$ref":"#/components/schemas/x402SettleErrorReason"},"errorMessage":{"type":"string","description":"The message describing the error reason.","example":"Insufficient funds"},"payer":{"allOf":[{"$ref":"#/components/schemas/BlockchainAddress"}],"description":"The onchain address of the client that is paying for the resource.\n\nFor EVM networks, the payer will be a 0x-prefixed, checksum EVM address.\n\nFor Solana-based networks, the payer will be a base58-encoded Solana address.","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"},"transaction":{"type":"string","description":"The transaction of the settlement.\nFor EVM networks, the transaction will be a 0x-prefixed, EVM transaction hash.\nFor Solana-based networks, the transaction will be a base58-encoded Solana signature.","pattern":"^(0x[a-fA-F0-9]{64}|[1-9A-HJ-NP-Za-km-z]{87,88})$","example":"0x89c91c789e57059b17285e7ba1716a1f5ff4c5dace0ea5a5135f26158d0421b9"},"network":{"type":"string","description":"The network where the settlement occurred.","example":"base"}},"required":["success","errorReason"],"example":{"success":false,"errorReason":"insufficient_funds","payer":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"}},"x402SupportedPaymentKind":{"type":"object","description":"The supported payment kind for the x402 protocol. A kind is comprised of a scheme and a network, which together uniquely identify a way to move money on the x402 protocol. For more details, please see [x402 Schemes](https://github.com/coinbase/x402?tab=readme-ov-file#schemes).","properties":{"x402Version":{"$ref":"#/components/schemas/X402Version"},"scheme":{"type":"string","description":"The scheme of the payment protocol.","enum":["exact","upto","batch-settlement"],"example":"exact"},"network":{"type":"string","description":"The network of the blockchain. The format corresponds to the `x402Version` of the enclosing `x402SupportedPaymentKind`: v1 uses human-readable names (see `X402V1Network`); v2 uses CAIP-2 chain IDs (see `X402V2Network`).","example":"base","enum":["base-sepolia","base","solana-devnet","solana","eip155:8453","eip155:84532","eip155:137","eip155:42161","eip155:480","eip155:4801","solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1"]},"extra":{"type":"object","description":"The optional additional scheme-specific payment info.\nCommon scheme-specific fields:\n  - `exact` on Solana: `feePayer` — the base58-encoded Solana address that pays transaction fees.\n  - `upto` on EVM: `name`, `version`, and `facilitatorAddress` — the EVM address of the facilitator that the client must bind into the Permit2 witness when constructing the payment payload.\n  - `batch-settlement` on EVM: `name`, `version`, `receiverAuthorizer` (the EVM address authorized to sign claim batches), `withdrawDelay` (channel non-cooperative withdraw delay in seconds, 900–2,592,000), and optionally `assetTransferMethod` (e.g., `\"eip3009\"`).","additionalProperties":true,"example":{"feePayer":"HpabPRRCFbBKSuJr5PdkVvQc85FyxyTWkFM2obBRSvHT"}}},"required":["x402Version","scheme","network"]},"x402ResourceQuality":{"type":"object","description":"Quality metrics for a discovered x402 resource.","properties":{"l30DaysTotalCalls":{"type":"integer","description":"Total number of paid calls to a resource in the last 30 days.","example":42},"l30DaysUniquePayers":{"type":"integer","description":"Number of unique payers to a resource in the last 30 days.","example":15},"lastCalledAt":{"type":"string","format":"date-time","description":"Timestamp of the most recent paid call to a resource.","example":"2024-01-15T10:30:00Z"}},"example":{"l30DaysTotalCalls":42,"l30DaysUniquePayers":15,"lastCalledAt":"2024-01-15T10:30:00Z"}},"x402DiscoveryResource":{"type":"object","description":"A single discovered x402 resource.","properties":{"resource":{"type":"string","description":"The URL of the resource.","example":"https://api.example.com/weather/forecast"},"description":{"type":"string","description":"A human-readable description of the resource.","example":"Real-time weather forecast data"},"type":{"type":"string","description":"Communication protocol (e.g., \"http\", \"mcp\").","enum":["http","mcp"],"example":"http"},"x402Version":{"$ref":"#/components/schemas/X402Version"},"lastUpdated":{"type":"string","format":"date-time","description":"Timestamp of the last update.","example":"2024-01-15T10:30:00Z"},"accepts":{"type":"array","description":"Payment requirements accepted by the resource.","items":{"$ref":"#/components/schemas/x402PaymentRequirements"},"example":[{"scheme":"exact","network":"eip155:8453","amount":"1000000","payTo":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","asset":"0x036CbD53842c5426634e7929541eC2318f3dCF7e","maxTimeoutSeconds":60}]},"extensions":{"type":"object","description":"Map of x402 protocol extensions supported by the resource, keyed by extension name.","additionalProperties":true,"example":{"bazaar":{"info":{"input":{"type":"http","method":"GET"}},"schema":{}}}},"quality":{"$ref":"#/components/schemas/x402ResourceQuality"},"serviceName":{"type":"string","description":"Provider-supplied display name of the service this resource belongs to. This is a free-form\nlabel for grouping and presentation only — it is not a stable identifier, and two resources\nsharing the same `serviceName` are not guaranteed to belong to the same logical service.\n","example":"Weather API"},"tags":{"type":"array","description":"Provider-supplied, low-cardinality string labels associated with the resource for client-side\nfiltering and display. Values are free-form (no controlled vocabulary) and case-sensitive.\nOrder is not significant and duplicates are not expected.\n","items":{"type":"string"},"example":["weather","data"]},"iconUrl":{"allOf":[{"$ref":"#/components/schemas/Url"}],"description":"URL of a square icon representing the service this resource belongs to. Distinct from a\nbrand logo: this is intended for compact, list-view rendering (favicon-style) and is\nnormalized to a square aspect ratio at ingestion. The image is moderated and re-hosted by\nCoinbase, so the URL is stable and safe to render directly in clients. Omitted when the\nprovider did not supply an icon, when the supplied icon failed moderation, or when image\nprocessing was unavailable at ingestion time.\n","example":"https://res.cloudinary.com/bdb-prod/image/upload/..."}},"required":["resource","type","x402Version"]},"x402DiscoveryResourcesResponse":{"type":"object","description":"Response containing discovered x402 resources.","properties":{"x402Version":{"$ref":"#/components/schemas/X402Version"},"items":{"type":"array","description":"List of discovered x402 resources.","items":{"$ref":"#/components/schemas/x402DiscoveryResource"},"example":[{"resource":"https://api.example.com/weather/forecast","description":"Real-time weather forecast data.","type":"http","x402Version":2,"lastUpdated":"2024-01-15T10:30:00Z","accepts":[{"scheme":"exact","network":"eip155:8453","amount":"1000000","payTo":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","asset":"0x036CbD53842c5426634e7929541eC2318f3dCF7e","maxTimeoutSeconds":60}],"extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET"}},"schema":{}}},"quality":{"l30DaysTotalCalls":42,"l30DaysUniquePayers":15,"lastCalledAt":"2024-01-15T10:30:00Z"},"serviceName":"Weather API","tags":["weather","data"],"iconUrl":"https://res.cloudinary.com/bdb-prod/image/upload/..."}]},"pagination":{"type":"object","description":"Pagination information for the response.","properties":{"limit":{"type":"integer","description":"The number of discovered x402 resources to return per page.","example":100},"offset":{"type":"integer","description":"The offset of the first discovered x402 resource to return.","example":0},"total":{"type":"integer","description":"The total number of discovered x402 resources.","example":1000}},"example":{"limit":100,"offset":0,"total":1000}}},"required":["items","x402Version","pagination"]},"x402DiscoveryMerchantResponse":{"type":"object","description":"Response containing x402 resources associated with a merchant payment address. The resources list is empty when no active resources are found.","properties":{"x402Version":{"$ref":"#/components/schemas/X402Version"},"payTo":{"$ref":"#/components/schemas/BlockchainAddress"},"resources":{"type":"array","description":"List of discovered x402 resources associated with the merchant's payTo address. This list is empty when no active resources are found.","items":{"$ref":"#/components/schemas/x402DiscoveryResource"},"example":[{"resource":"https://api.example.com/premium/data","description":"Premium API access for data analysis.","type":"http","x402Version":2,"lastUpdated":"2024-01-15T10:30:00Z","accepts":[{"scheme":"exact","network":"eip155:8453","amount":"1000000","payTo":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","asset":"0x036CbD53842c5426634e7929541eC2318f3dCF7e","maxTimeoutSeconds":60}],"extensions":{"bazaar":{"info":{"input":{"type":"http","method":"POST"}},"schema":{}}},"quality":{"l30DaysTotalCalls":42,"l30DaysUniquePayers":15,"lastCalledAt":"2024-01-15T10:30:00Z"},"serviceName":"Premium Data API","tags":["data","analytics"],"iconUrl":"https://res.cloudinary.com/bdb-prod/image/upload/..."}]},"pagination":{"type":"object","description":"Pagination information for the response.","properties":{"limit":{"type":"integer","description":"The number of resources returned per page.","example":20},"offset":{"type":"integer","description":"The offset of the first resource returned.","example":0},"total":{"type":"integer","description":"The total number of resources associated with the merchant's payTo address.","example":10}},"example":{"limit":20,"offset":0,"total":10}}},"required":["x402Version","payTo","resources","pagination"]},"x402SearchResourcesResponse":{"type":"object","description":"Response from a search for x402 resources.","properties":{"resources":{"type":"array","description":"List of x402 resources matching the search query and filters.","items":{"$ref":"#/components/schemas/x402DiscoveryResource"},"example":[{"resource":"https://api.example.com/weather/forecast","description":"Real-time weather forecast data.","type":"http","x402Version":2,"lastUpdated":"2024-01-15T10:30:00Z","accepts":[{"scheme":"exact","network":"eip155:8453","amount":"1000000","payTo":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","asset":"0x036CbD53842c5426634e7929541eC2318f3dCF7e","maxTimeoutSeconds":60}],"extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET"}},"schema":{}}},"quality":{"l30DaysTotalCalls":42,"l30DaysUniquePayers":15,"lastCalledAt":"2024-01-15T10:30:00Z"},"serviceName":"Weather API","tags":["weather","data"],"iconUrl":"https://res.cloudinary.com/bdb-prod/image/upload/..."}]},"partialResults":{"type":"boolean","description":"Indicates whether the result set was truncated because there were more results than the requested limit.","example":false},"searchMethod":{"type":"string","description":"The search method used to retrieve the results (e.g., \"text\", \"vector\", \"hybrid\").","enum":["text","vector","hybrid"],"example":"text"},"x402Version":{"$ref":"#/components/schemas/X402Version"}},"required":["resources","partialResults","x402Version"]},"x402McpRequest":{"type":"object","description":"A JSON-RPC 2.0 request for the Model Context Protocol.","properties":{"jsonrpc":{"type":"string","enum":["2.0"],"description":"JSON-RPC version, must be \"2.0\".","example":"2.0"},"id":{"oneOf":[{"type":"string"},{"type":"integer"}],"description":"Request identifier.","example":1},"method":{"type":"string","description":"The MCP method to invoke.","example":"tools/list"},"params":{"type":"object","description":"Optional parameters for the method.","additionalProperties":true,"example":{}}},"required":["jsonrpc","method"]},"x402McpError":{"type":"object","description":"JSON-RPC 2.0 error object.","properties":{"code":{"type":"integer","description":"Error code.","example":-32600},"message":{"type":"string","description":"Error message.","example":"Invalid Request"},"data":{"type":"object","description":"Additional error data.","additionalProperties":true,"example":{}}},"required":["code","message"],"example":{"code":-32600,"message":"Invalid Request","data":{}}},"x402McpResponse":{"type":"object","description":"A JSON-RPC 2.0 response for the Model Context Protocol.","properties":{"jsonrpc":{"type":"string","enum":["2.0"],"description":"JSON-RPC version.","example":"2.0"},"id":{"oneOf":[{"type":"string"},{"type":"integer"}],"nullable":true,"description":"Request identifier (matches the request ID, null for notifications).","example":1},"result":{"type":"object","description":"The result of the method call (present on success).","additionalProperties":true,"example":{"tools":[]}},"error":{"$ref":"#/components/schemas/x402McpError"}},"required":["jsonrpc"]},"HttpsUrl":{"type":"string","format":"uri","minLength":12,"maxLength":2048,"pattern":"^https://.*$","description":"A valid HTTPS URL.","example":"https://example.com"},"x402ValidateRequest":{"type":"object","description":"Request to validate an x402 endpoint's bazaar-discovery configuration.","properties":{"resource":{"allOf":[{"$ref":"#/components/schemas/HttpsUrl"}],"description":"HTTPS URL of the x402 endpoint to validate. Must use the `https://` scheme.","example":"https://api.example.com/weather/forecast"},"method":{"type":"string","description":"The HTTP method used to probe the endpoint. Only GET and POST are supported; other verbs are intentionally rejected because x402 resources are expected to respond to these methods.","enum":["GET","POST"],"default":"GET","example":"GET"}},"required":["resource"],"example":{"resource":"https://api.example.com/weather/forecast","method":"GET"}},"x402ValidateCheck":{"type":"object","description":"The result of a single preflight check performed against the x402 endpoint.","properties":{"check":{"type":"string","description":"The name of the preflight check. New values may be added in future versions; clients should handle unknown values gracefully.","enum":["reachable","returns_402","has_bazaar_extension","parse"],"example":"returns_402"},"passed":{"type":"boolean","description":"Whether the check passed.","example":true},"detail":{"type":"string","description":"A human-readable explanation of the check result.","example":"Endpoint responded with HTTP 402 Payment Required."},"expected":{"type":"string","description":"The value the check expected, when applicable.","example":"402"},"actual":{"type":"string","description":"The value the check observed, when applicable.","example":"402"},"severity":{"type":"string","enum":["required","advisory"],"description":"Whether this check is a hard indexing requirement or a quality recommendation. A `required` check affects validity when it fails. An `advisory` check (for example, a missing output schema) is a suggestion to improve discoverability and does not make the endpoint invalid.","example":"required"}},"required":["check","passed","detail","severity"],"example":{"check":"returns_402","passed":true,"detail":"Endpoint responded with HTTP 402 Payment Required.","expected":"402","actual":"402","severity":"required"}},"x402ValidateSimulation":{"type":"object","description":"The simulated facilitator decision for the x402 endpoint.","properties":{"outcome":{"type":"string","description":"The simulated facilitator outcome: `accepted` if the facilitator would index the resource, or `rejected` if it would reject it.","enum":["accepted","rejected"],"example":"accepted"},"rejectionReason":{"type":"string","description":"The reason the resource would be rejected, present only when `outcome` is `rejected`.","example":"Resource is missing a supported payment scheme."}},"required":["outcome"],"example":{"outcome":"accepted"}},"x402ValidateIndex":{"type":"object","description":"Bazaar index status for a validated x402 endpoint.","properties":{"active":{"type":"boolean","description":"Whether the indexed resource is active and served in discovery results.","example":true},"lastCrawledAt":{"type":"string","format":"date-time","nullable":true,"description":"When the endpoint was last crawled, or `null` if it has been indexed but not yet crawled.","example":"2026-06-01T12:00:00Z"},"quality":{"allOf":[{"$ref":"#/components/schemas/x402ResourceQuality"}],"description":"Quality metrics for the indexed resource, present only when the endpoint has call history."}},"required":["active","lastCrawledAt"],"example":{"active":true,"lastCrawledAt":"2026-06-01T12:00:00Z","quality":{"l30DaysTotalCalls":42,"l30DaysUniquePayers":15,"lastCalledAt":"2026-06-01T12:00:00Z"}}},"x402ValidateResponse":{"type":"object","description":"Response from validating an x402 endpoint's bazaar-discovery configuration.","properties":{"valid":{"type":"boolean","description":"Whether the endpoint is valid: all preflight checks passed and the facilitator would index the resource.","example":true},"statusCode":{"type":"integer","nullable":true,"description":"The HTTP status code returned by the endpoint, or `null` if the endpoint was not reachable.","example":402},"x402Version":{"type":"integer","nullable":true,"description":"The x402 protocol version advertised by the endpoint, or `null` if it could not be determined. Intentionally a bare integer rather than the `X402Version` enum so the validator can surface unsupported or malformed version values returned by non-conforming endpoints.","example":2},"preflight":{"type":"array","description":"All check results in run order. Well-known check names are `reachable`, `returns_402`, `has_bazaar_extension`, and `parse`. Additional checks may be added in future versions.","items":{"$ref":"#/components/schemas/x402ValidateCheck"}},"paymentRequirements":{"type":"object","nullable":true,"allOf":[{"$ref":"#/components/schemas/x402PaymentRequirements"}],"description":"The raw decoded payment requirements returned by the endpoint, or `null` if the endpoint was not reachable or did not return a parseable 402 payload. Lets sellers inspect exactly what their endpoint is advertising."},"bazaarExtension":{"type":"object","nullable":true,"additionalProperties":true,"description":"The `extensions.bazaar` block from the endpoint's discovery metadata, or `null` if the bazaar extension was absent or the endpoint was not reachable. Lets sellers verify the discovery configuration their endpoint is advertising.","example":{"info":{"input":{"type":"http","method":"GET"}},"schema":{}}},"simulation":{"$ref":"#/components/schemas/x402ValidateSimulation"},"index":{"type":"object","nullable":true,"allOf":[{"$ref":"#/components/schemas/x402ValidateIndex"}],"description":"Bazaar index status for the endpoint, or `null` if the endpoint is not yet indexed. Present on every response regardless of simulation outcome."}},"required":["valid","statusCode","x402Version","preflight","paymentRequirements","bazaarExtension","simulation","index"],"example":{"valid":true,"statusCode":402,"x402Version":2,"preflight":[{"check":"reachable","passed":true,"detail":"Endpoint responded within the timeout.","severity":"required"},{"check":"returns_402","passed":true,"detail":"Endpoint responded with HTTP 402 Payment Required.","expected":"402","actual":"402","severity":"required"},{"check":"has_bazaar_extension","passed":true,"detail":"Payment requirements include the bazaar discovery extension.","severity":"required"},{"check":"parse","passed":true,"detail":"Payment requirements parsed successfully.","severity":"required"}],"paymentRequirements":{"scheme":"exact","network":"base","maxAmountRequired":"100000","resource":"https://api.example.com/weather/forecast","description":"Real-time weather forecast data.","mimeType":"application/json","payTo":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","asset":"0x036CbD53842c5426634e7929541eC2318f3dCF7e","maxTimeoutSeconds":60},"bazaarExtension":{"info":{"input":{"type":"http","method":"GET"}},"schema":{}},"simulation":{"outcome":"accepted"},"index":{"active":true,"lastCrawledAt":"2026-06-01T12:00:00Z","quality":{"l30DaysTotalCalls":42,"l30DaysUniquePayers":15,"lastCalledAt":"2026-06-01T12:00:00Z"}}}},"InitiateOnrampVerificationRequest":{"type":"object","description":"Request body for initiating an onramp OTP verification.","properties":{"channel":{"description":"The OTP delivery channel.","type":"string","enum":["sms","email"],"example":"sms"},"destination":{"description":"The phone number or email address to send the OTP to.","oneOf":[{"$ref":"#/components/schemas/PhoneNumber"},{"$ref":"#/components/schemas/Email"}],"example":"+12055555555"}},"required":["channel","destination"]},"OnrampVerificationId":{"type":"string","description":"A unique identifier for an onramp verification record, in the format `onramp_verification_<uuid>`.","pattern":"^onramp_verification_[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$","example":"onramp_verification_a1b2c3d4-e5f6-7890-abcd-ef1234567890"},"OnrampVerificationInitiation":{"type":"object","description":"The result of initiating an onramp OTP verification.","properties":{"verificationId":{"allOf":[{"$ref":"#/components/schemas/OnrampVerificationId"}],"description":"Identifier returned by this endpoint. Pass to the Submit Onramp Verification endpoint along with the OTP code within 10 minutes.","example":"onramp_verification_a1b2c3d4-e5f6-7890-abcd-ef1234567890"},"otpExpiresAt":{"description":"The deadline for submitting the OTP code (10 minutes from now).","type":"string","format":"date-time","example":"2025-04-24T00:10:00Z"}},"required":["verificationId","otpExpiresAt"]},"SubmitOnrampVerificationRequest":{"type":"object","description":"Request body for submitting an OTP code to complete an onramp verification.","properties":{"otpCode":{"description":"The 6-digit OTP code the user received.","type":"string","pattern":"^\\d{6}$","example":"123456"}},"required":["otpCode"]},"OnrampVerificationConfirmation":{"type":"object","description":"The result of successfully submitting an onramp OTP verification.","properties":{"verificationId":{"allOf":[{"$ref":"#/components/schemas/OnrampVerificationId"}],"description":"The same verification ID. Store on the user's device and pass to the Create Onramp Order endpoint. Valid for 60 days.","example":"onramp_verification_a1b2c3d4-e5f6-7890-abcd-ef1234567890"},"verificationExpiresAt":{"description":"The date and time when this verification expires for order placement.","type":"string","format":"date-time","example":"2025-06-23T00:00:00Z"}},"required":["verificationId","verificationExpiresAt"]},"OnrampOrderPaymentMethodTypeId":{"type":"string","description":"The type of payment method to be used to complete an onramp order.","enum":["GUEST_CHECKOUT_APPLE_PAY","GUEST_CHECKOUT_GOOGLE_PAY"],"example":"GUEST_CHECKOUT_APPLE_PAY"},"OnrampOrderFee":{"type":"object","description":"A fee associated with an order.","properties":{"type":{"type":"string","enum":["FEE_TYPE_NETWORK","FEE_TYPE_EXCHANGE"],"description":"The type of fee.","example":"FEE_TYPE_NETWORK"},"amount":{"type":"string","description":"The amount of the fee.","example":"0.95"},"currency":{"type":"string","description":"The currency of the fee.","example":"USDC"}},"required":["type","amount","currency"]},"OnrampOrderStatus":{"type":"string","description":"The status of an onramp order.","enum":["ONRAMP_ORDER_STATUS_PENDING_AUTH","ONRAMP_ORDER_STATUS_PENDING_PAYMENT","ONRAMP_ORDER_STATUS_PROCESSING","ONRAMP_ORDER_STATUS_COMPLETED","ONRAMP_ORDER_STATUS_FAILED"],"example":"ONRAMP_ORDER_STATUS_COMPLETED"},"OnrampOrder":{"type":"object","description":"An Onramp order.","properties":{"orderId":{"type":"string","description":"The ID of the onramp order.","example":"123e4567-e89b-12d3-a456-426614174000"},"paymentTotal":{"type":"string","description":"The total amount of fiat to be paid, inclusive of any fees.","example":"100.75"},"paymentSubtotal":{"type":"string","description":"The amount of fiat to be converted to crypto.","example":"100"},"paymentCurrency":{"type":"string","description":"The fiat currency to be converted to crypto.","example":"USD"},"paymentMethod":{"$ref":"#/components/schemas/OnrampOrderPaymentMethodTypeId"},"purchaseAmount":{"type":"string","description":"The amount of crypto to be purchased.","example":"100.000000"},"purchaseCurrency":{"type":"string","description":"The crypto currency to be purchased.","example":"USDC"},"fees":{"type":"array","description":"The fees associated with the order.","items":{"$ref":"#/components/schemas/OnrampOrderFee"},"example":[{"type":"FEE_TYPE_EXCHANGE","amount":"0.5","currency":"USD"},{"type":"FEE_TYPE_NETWORK","amount":"0.25","currency":"USD"}]},"exchangeRate":{"type":"string","description":"The exchange rate used to convert fiat to crypto i.e. the crypto value of one fiat.","example":"1"},"destinationAddress":{"allOf":[{"$ref":"#/components/schemas/BlockchainAddress"}],"description":"The destination address to send the crypto to.","example":"0x71C7656EC7ab88b098defB751B7401B5f6d8976F"},"destinationNetwork":{"type":"string","description":"The network to send the crypto on.","example":"base"},"status":{"$ref":"#/components/schemas/OnrampOrderStatus"},"txHash":{"type":"string","description":"The transaction hash of the order (only available once crypto has been sent).","example":"0x363cd3b3d4f49497cf5076150cd709307b90e9fc897fdd623546ea7b9313cecb"},"createdAt":{"type":"string","description":"The date and time the order was created.","example":"2025-04-24T00:00:00Z"},"updatedAt":{"type":"string","description":"The date and time the order was last updated.","example":"2025-04-24T00:00:00Z"},"partnerUserRef":{"type":"string","description":"The partner user reference ID.","example":"user123"}},"required":["orderId","paymentTotal","paymentSubtotal","paymentCurrency","paymentMethod","purchaseAmount","purchaseCurrency","fees","exchangeRate","destinationAddress","destinationNetwork","status","createdAt","updatedAt"]},"OnrampPaymentLinkType":{"type":"string","description":"The type of payment link.","enum":["PAYMENT_LINK_TYPE_APPLE_PAY_BUTTON"],"example":"PAYMENT_LINK_TYPE_APPLE_PAY_BUTTON"},"OnrampPaymentLink":{"type":"object","description":"A payment link to pay for an order.\n\nPlease refer to the [Onramp docs](https://docs.cdp.coinbase.com/onramp-&-offramp/onramp-apis/onramp-overview) for details on how to integrate with the different payment link types.","properties":{"url":{"allOf":[{"$ref":"#/components/schemas/Url"}],"description":"The URL to the hosted widget the user should be redirected to. For certain payment link types you can append your own redirect_url query parameter to this URL to ensure the user is redirected back to your app after the widget completes.","example":"https://pay.coinbase.com/v2/api-onramp/apple-pay?sessionToken=MWYwNWQwODktZTZlYy02OTdlLTgzZTYtMTI3NzcyOWJhNjM3"},"paymentLinkType":{"$ref":"#/components/schemas/OnrampPaymentLinkType"}},"required":["url","paymentLinkType"]},"OnrampQuotePaymentMethodTypeId":{"type":"string","description":"The type of payment method used to generate the onramp quote.","enum":["CARD","ACH","APPLE_PAY","PAYPAL","FIAT_WALLET","CRYPTO_WALLET"],"example":"CARD"},"Uri":{"type":"string","format":"uri","minLength":5,"maxLength":2048,"pattern":"^.*://.*$","description":"A valid URI.","example":"foo://bar"},"OnrampSessionRequest":{"type":"object","description":"Common request parameters shared by [Create Onramp Session](#operation/createOnrampSession) and [Create Onramp Mobile Challenge](#operation/createOnrampMobileChallenge).","properties":{"purchaseCurrency":{"description":"The ticker (e.g. `BTC`, `USDC`, `SOL`) or the Coinbase UUID (e.g. `d85dce9b-5b73-5c3c-8978-522ce1d1c1b4`) of the crypto asset to be purchased.\n\nUse the [Onramp Buy Options API](https://docs.cdp.coinbase.com/api-reference/rest-api/onramp-offramp/get-buy-options) to discover the supported purchase currencies for your user's location.","type":"string","example":"USDC"},"destinationNetwork":{"description":"The name of the crypto network the purchased currency will be sent on.\n\nUse the [Onramp Buy Options API](https://docs.cdp.coinbase.com/api-reference/rest-api/onramp-offramp/get-buy-options) to discover the supported networks for your user's location.","type":"string","example":"base"},"destinationAddress":{"allOf":[{"$ref":"#/components/schemas/BlockchainAddress"}],"description":"The address the purchased crypto will be sent to.","example":"0x1234567890abcdef1234567890abcdef12345678"},"paymentAmount":{"description":"A string representing the amount of fiat the user wishes to pay in exchange for crypto. When using this parameter, the returned quote will be inclusive of fees i.e. the user will pay this exact amount of the payment currency.","type":"string","example":"100.00"},"purchaseAmount":{"description":"A string representing the amount of crypto the user wishes to purchase. When using this parameter, the returned quote will be exclusive of fees i.e. the user will receive this exact amount of the purchase currency.","type":"string","example":"10.000000"},"paymentCurrency":{"description":"The fiat currency to be converted to crypto.","type":"string","example":"USD"},"paymentMethod":{"$ref":"#/components/schemas/OnrampQuotePaymentMethodTypeId"},"country":{"description":"The ISO 3166-1 two letter country code (e.g. US).","type":"string","example":"US"},"subdivision":{"description":"The ISO 3166-2 two letter state code (e.g. NY). Only required for US.","type":"string","example":"NY"},"redirectUrl":{"allOf":[{"$ref":"#/components/schemas/Uri"}],"description":"URI to redirect the user to after they complete or dismiss the transaction. Embedded in the returned onramp URL as a query parameter.","example":"https://example.com/success"},"clientIp":{"description":"The IP address of the end user requesting the onramp transaction.","type":"string","example":"127.0.0.1"},"partnerUserRef":{"description":"A unique string that represents the user in your app. This can be used to link individual transactions together so you can retrieve the transaction history for your users. Prefix this string with \"sandbox-\" (e.g. \"sandbox-user-1234\") to perform a sandbox transaction which will allow you to test your integration without any real transfer of funds.\n\nThis value can be used with the [Onramp User Transactions API](https://docs.cdp.coinbase.com/api-reference/rest-api/onramp-offramp/get-onramp-transactions-by-id) to retrieve all transactions created by the user.","type":"string","example":"user-1234"}},"required":["destinationAddress","purchaseCurrency","destinationNetwork"]},"OnrampSession":{"type":"object","description":"An onramp session containing a ready-to-use onramp URL.","properties":{"onrampUrl":{"allOf":[{"$ref":"#/components/schemas/Url"}],"description":"Ready-to-use onramp URL.","example":"https://pay.coinbase.com/buy?sessionToken=abc123F"}},"required":["onrampUrl"],"example":{"onrampUrl":"https://pay.coinbase.com/buy?sessionToken=abc123F"}},"OnrampQuote":{"type":"object","description":"Quote information with pricing details for the crypto purchase.","properties":{"paymentTotal":{"type":"string","description":"The total amount of fiat to be paid, inclusive of any fees.","example":"100.75"},"paymentSubtotal":{"type":"string","description":"The amount of fiat to be converted to crypto.","example":"100.00"},"paymentCurrency":{"type":"string","description":"The fiat currency to be converted to crypto.","example":"USD"},"purchaseAmount":{"type":"string","description":"The amount of crypto to be purchased.","example":"100.000000"},"purchaseCurrency":{"type":"string","description":"The crypto currency to be purchased.","example":"USDC"},"destinationNetwork":{"type":"string","description":"The network to send the crypto on.","example":"base"},"fees":{"type":"array","description":"The fees associated with the quote.","items":{"$ref":"#/components/schemas/OnrampOrderFee"},"example":[{"type":"FEE_TYPE_EXCHANGE","amount":"0.5","currency":"USD"},{"type":"FEE_TYPE_NETWORK","amount":"0.25","currency":"USD"}]},"exchangeRate":{"type":"string","description":"The exchange rate used to convert fiat to crypto i.e. the crypto value of one fiat.","example":"1"}},"required":["paymentTotal","paymentSubtotal","paymentCurrency","purchaseAmount","purchaseCurrency","destinationNetwork","fees","exchangeRate"],"example":{"paymentTotal":"100.75","paymentSubtotal":"100.00","paymentCurrency":"USD","purchaseAmount":"100.000000","purchaseCurrency":"USDC","destinationNetwork":"base","fees":[{"type":"FEE_TYPE_EXCHANGE","amount":"0.5","currency":"USD"},{"type":"FEE_TYPE_NETWORK","amount":"0.25","currency":"USD"}],"exchangeRate":"1"}},"OnrampUserIdType":{"type":"string","description":"The type of user identifier:\n- `phone_number`: A phone number in E.164 format associated with an onramp user.\n","enum":["phone_number"],"example":"phone_number"},"OnrampLimitType":{"type":"string","description":"The type of limit:\n- `weekly_spending`: Rolling 7-day spending limit. The limit applies to the sum of all completed transactions \n  within a sliding 168-hour (7-day) window. As time passes, older transactions naturally expire from the window. \n  $500 is the default limit.\n- `lifetime_transactions`: All-time transaction count limit. Tracks the total number of completed transactions \n  across the user's entire history with no time-based expiration. Once the limit is reached, no further \n  transactions are allowed. 15 is the default limit.\n","enum":["weekly_spending","lifetime_transactions"],"example":"weekly_spending"},"OnrampUserLimit":{"type":"object","description":"A single limit with remaining capacity.","properties":{"limitType":{"$ref":"#/components/schemas/OnrampLimitType"},"currency":{"type":"string","description":"The currency of the limit amounts. Only present for spending limits, not for count-based limits.","example":"USD"},"limit":{"type":"string","description":"The maximum limit value.","example":"2500"},"remaining":{"type":"string","description":"The remaining amount or count available.","example":"2000"}},"required":["limitType","limit","remaining"]},"OnrampLimitUpgradeIdentityFields":{"type":"object","description":"Populate the properties that correspond to the `fields` array from the user's `OnrampLimitUpgradeOption`.","properties":{"ssnLast4":{"type":"string","description":"Last 4 digits of the Social Security Number (no dashes or spaces).","example":"5678"},"dateOfBirth":{"allOf":[{"$ref":"#/components/schemas/DateOfBirth"}],"description":"Date of birth."}},"example":{"ssnLast4":"5678","dateOfBirth":{"day":"15","month":"08","year":"1990"}}},"OnrampLimitUpgradeRequest":{"type":"object","description":"Request to request a limits upgrade for a user.","properties":{"userId":{"type":"string","description":"The user identifier value. For `phone_number` type, this must be in E.164 format.","example":"+12055555555"},"userIdType":{"$ref":"#/components/schemas/OnrampUserIdType"},"fields":{"$ref":"#/components/schemas/OnrampLimitUpgradeIdentityFields","description":"Populate the properties that correspond to the `fields` array from the user's `OnrampLimitUpgradeOption`. These fields are required; a request without them is rejected."}},"required":["userId","userIdType"],"example":{"userId":"+12055555555","userIdType":"phone_number","fields":{"ssnLast4":"5678","dateOfBirth":{"day":"15","month":"08","year":"1990"}}}},"PaymentMethodBase":{"type":"object","description":"Common properties shared by all payment method types.","properties":{"paymentMethodId":{"$ref":"#/components/schemas/PaymentMethodId"},"active":{"type":"boolean","description":"Whether the payment method is active and can be used in transfers. A payment method may be inactive due to verification requirements or entity-level restrictions.","example":true},"createdAt":{"type":"string","format":"date-time","description":"The timestamp when the payment method was created.","example":"2024-01-15T10:30:00Z"},"updatedAt":{"type":"string","format":"date-time","description":"The timestamp when the payment method was last updated.","example":"2024-01-15T10:30:00Z"}},"required":["paymentMethodId","active","createdAt","updatedAt"]},"FedwireDetails":{"type":"object","description":"Details specific to Fedwire (domestic USD wire) payment methods.","properties":{"asset":{"type":"string","description":"The asset for this payment method. Always `usd` for Fedwire.","example":"usd"},"bankName":{"type":"string","description":"The name of the bank.","example":"ALLY BANK"},"accountLast4":{"type":"string","description":"The last 4 digits of the bank account number.","pattern":"^[0-9]{4}$","example":"1234"},"routingNumber":{"type":"string","description":"The ABA routing number of the bank.","pattern":"^[0-9]{9}$","example":"124003116"}},"required":["asset","bankName","accountLast4","routingNumber"],"example":{"asset":"usd","bankName":"ALLY BANK","accountLast4":"1234","routingNumber":"124003116"}},"FedwirePaymentMethod":{"type":"object","title":"FedwirePaymentMethod","description":"A Fedwire (domestic USD wire) payment method linked to your entity.","allOf":[{"$ref":"#/components/schemas/PaymentMethodBase"},{"type":"object","properties":{"paymentRail":{"type":"string","description":"The payment rail for this payment method.","enum":["fedwire"],"example":"fedwire"},"fedwire":{"allOf":[{"$ref":"#/components/schemas/FedwireDetails"}],"description":"Fedwire (domestic USD wire) details."}},"required":["paymentRail","fedwire"]}],"example":{"paymentMethodId":"paymentMethod_8e03978e-40d5-43e8-bc93-6894a57f9324","paymentRail":"fedwire","active":true,"createdAt":"2024-01-15T10:30:00Z","updatedAt":"2024-01-15T10:30:00Z","fedwire":{"asset":"usd","bankName":"ALLY BANK","accountLast4":"1234","routingNumber":"124003116"}}},"SwiftDetails":{"type":"object","description":"Details specific to SWIFT (international wire) payment methods.","properties":{"asset":{"type":"string","description":"The asset for this payment method (e.g., `eur`, `gbp`).","example":"eur"},"bankName":{"type":"string","description":"The name of the bank.","example":"Deutsche Bank"},"accountLast4":{"type":"string","description":"The last 4 characters of the account identifier. For IBAN-based accounts (e.g., EU), this is the last 4 characters of the IBAN. For account number-based accounts (e.g., US), this is the last 4 digits of the account number.","pattern":"^[A-Z0-9]{4}$","example":"5678"},"ibanLast4":{"type":"string","deprecated":true,"description":"Deprecated: use `accountLast4` instead. The last 4 characters of the account identifier.","pattern":"^[A-Z0-9]{4}$","example":"5678"},"bic":{"type":"string","description":"The Bank Identifier Code (BIC) / SWIFT code.","pattern":"^[A-Z]{6}[A-Z0-9]{2}([A-Z0-9]{3})?$","example":"DEUTDEFF"}},"required":["asset","bankName","accountLast4","bic"],"example":{"asset":"eur","bankName":"Deutsche Bank","accountLast4":"5678","ibanLast4":"5678","bic":"DEUTDEFF"}},"SwiftPaymentMethod":{"type":"object","title":"SwiftPaymentMethod","description":"A SWIFT (international wire) payment method linked to your entity.","allOf":[{"$ref":"#/components/schemas/PaymentMethodBase"},{"type":"object","properties":{"paymentRail":{"type":"string","description":"The payment rail for this payment method.","enum":["swift"],"example":"swift"},"swift":{"allOf":[{"$ref":"#/components/schemas/SwiftDetails"}],"description":"SWIFT (international wire) details."}},"required":["paymentRail","swift"]}],"example":{"paymentMethodId":"paymentMethod_def45678-1234-5678-9abc-def012345678","paymentRail":"swift","active":true,"createdAt":"2024-01-15T10:30:00Z","updatedAt":"2024-01-15T10:30:00Z","swift":{"asset":"eur","bankName":"Deutsche Bank","accountLast4":"5678","ibanLast4":"5678","bic":"DEUTDEFF"}}},"SepaDetails":{"type":"object","description":"Details specific to SEPA (Single Euro Payments Area) payment methods.","properties":{"asset":{"type":"string","description":"The asset for this payment method. Always `eur` for SEPA.","example":"eur"},"bankName":{"type":"string","description":"The name of the bank.","example":"ING Bank"},"ibanLast4":{"type":"string","description":"The last 4 characters of the IBAN.","pattern":"^[A-Z0-9]{4}$","example":"4300"},"bic":{"type":"string","description":"The Bank Identifier Code (BIC) / SWIFT code.","pattern":"^[A-Z]{6}[A-Z0-9]{2}([A-Z0-9]{3})?$","example":"INGBNL2A"}},"required":["asset","bankName","ibanLast4","bic"],"example":{"asset":"eur","bankName":"ING Bank","ibanLast4":"4300","bic":"INGBNL2A"}},"SepaPaymentMethod":{"type":"object","title":"SepaPaymentMethod","description":"A SEPA (Single Euro Payments Area) payment method linked to your entity.","allOf":[{"$ref":"#/components/schemas/PaymentMethodBase"},{"type":"object","properties":{"paymentRail":{"type":"string","description":"The payment rail for this payment method.","enum":["sepa"],"example":"sepa"},"sepa":{"allOf":[{"$ref":"#/components/schemas/SepaDetails"}],"description":"SEPA (Single Euro Payments Area) details."}},"required":["paymentRail","sepa"]}],"example":{"paymentMethodId":"paymentMethod_abc12345-6789-0abc-def0-123456789abc","paymentRail":"sepa","active":true,"createdAt":"2024-01-15T10:30:00Z","updatedAt":"2024-01-15T10:30:00Z","sepa":{"asset":"eur","bankName":"ING Bank","ibanLast4":"4300","bic":"INGBNL2A"}}},"payment-methods_PaymentMethod":{"description":"A payment method linked to your entity. Payment methods represent external financial instruments that can be used as a target for transfers.\n\nThe `paymentRail` field indicates which type-specific details object is present. Type-specific fields are nested under a key matching the rail name (e.g., `fedwire`, `swift`).","oneOf":[{"$ref":"#/components/schemas/FedwirePaymentMethod"},{"$ref":"#/components/schemas/SwiftPaymentMethod"},{"$ref":"#/components/schemas/SepaPaymentMethod"}],"discriminator":{"propertyName":"paymentRail","mapping":{"fedwire":"#/components/schemas/FedwirePaymentMethod","swift":"#/components/schemas/SwiftPaymentMethod","sepa":"#/components/schemas/SepaPaymentMethod"}}},"OnchainActivityEventParameters":{"type":"object","description":"Decoded event parameters from the contract event. Keys correspond to the named arguments in the event signature (e.g., `from`, `to`, `value` for an ERC-20 `Transfer`). Values are returned as strings to preserve precision for large integers and to avoid loss for address types. The exact set of keys depends on the contract event.","additionalProperties":{"type":"string"},"example":{"from":"0xF33a96b5932D9E9B9A0eDA447AbD8C9d48d2e0c8","to":"0x61040E143A77F165Ba44543AF4A079F2C809D14b","value":"474891138228179365"}},"OnchainActivityDetectedEvent":{"type":"object","x-event-type":"onchain.activity.detected","description":"The payload delivered when onchain activity matching your subscription filters is detected. Each event corresponds to a single decoded contract log emitted onchain. The set of keys in `parameters` varies by the contract event being decoded (e.g., `Transfer(address,address,uint256)`).","properties":{"block_number":{"type":"integer","format":"int64","description":"The block number containing the transaction that emitted the event.","example":46218191},"contract_address":{"type":"string","description":"The contract address that emitted the event.","example":"0x940181a94A35A4569E4529A3CDfB74e38FD98631"},"event_name":{"type":"string","description":"The name of the decoded contract event.","example":"Transfer"},"event_signature":{"type":"string","description":"The canonical event signature used to decode the log, including parameter types (e.g., `Transfer(address,address,uint256)`).","example":"Transfer(address,address,uint256)"},"log_index":{"type":"integer","format":"int64","description":"The zero-based index of the log within the transaction.","example":29},"network":{"type":"string","description":"The blockchain network where the activity was detected.","example":"base-mainnet"},"parameters":{"$ref":"#/components/schemas/OnchainActivityEventParameters"},"timestamp":{"type":"string","format":"date-time","description":"The block timestamp of the transaction (ISO 8601 format).","example":"2026-05-19T21:22:10Z"},"transaction_from":{"type":"string","description":"The address that initiated the transaction (the transaction sender).","example":"0x3E16D476D8Df15e3E776EAa5A46f37EC44C830cD"},"transaction_hash":{"type":"string","description":"The hash of the transaction that emitted the event.","example":"0xa58e4471bcce875b1ea49cc0864a620d3a484b9b7c1b0b4fd18ce83f5b30e5e0"},"transaction_to":{"type":"string","description":"The address the transaction was sent to (typically a contract address).","example":"0x61040E143A77F165Ba44543AF4A079F2C809D14b"}},"required":["block_number","contract_address","event_name","event_signature","log_index","network","parameters","timestamp","transaction_from","transaction_hash","transaction_to"],"example":{"block_number":46218191,"contract_address":"0x940181a94A35A4569E4529A3CDfB74e38FD98631","event_name":"Transfer","event_signature":"Transfer(address,address,uint256)","log_index":29,"network":"base-mainnet","parameters":{"from":"0xF33a96b5932D9E9B9A0eDA447AbD8C9d48d2e0c8","to":"0x61040E143A77F165Ba44543AF4A079F2C809D14b","value":"474891138228179365"},"timestamp":"2026-05-19T21:22:10Z","transaction_from":"0x3E16D476D8Df15e3E776EAa5A46f37EC44C830cD","transaction_hash":"0xa58e4471bcce875b1ea49cc0864a620d3a484b9b7c1b0b4fd18ce83f5b30e5e0","transaction_to":"0x61040E143A77F165Ba44543AF4A079F2C809D14b"}},"OnchainActivityEventData":{"type":"object","description":"Decoded blockchain event data for the wallet activity webhook. The exact fields depend on the type of onchain activity detected. Common fields include network, block info, and transaction hash. Additional fields are event-specific (e.g., `from`, `to`, `value` for transfers).","properties":{"network":{"type":"string","description":"The blockchain network where the activity was detected.","example":"base-mainnet"},"blockNumber":{"type":"string","description":"The block number containing the transaction.","example":"12345678"},"blockTimestamp":{"type":"string","format":"date-time","description":"The timestamp of the block.","example":"2025-06-01T11:59:55Z"},"transactionHash":{"type":"string","description":"The transaction hash of the detected activity.","example":"0xabc123def456789012345678901234567890abcdef1234567890abcdef123456"},"logIndex":{"type":"string","description":"The log index within the transaction.","example":"0"},"contractAddress":{"type":"string","description":"The contract address that emitted the event.","example":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"},"eventName":{"type":"string","description":"The name of the decoded contract event.","example":"Transfer"}},"additionalProperties":true,"required":["network","transactionHash"],"example":{"network":"base-mainnet","blockNumber":"12345678","blockTimestamp":"2025-06-01T11:59:55Z","transactionHash":"0xabc123def456789012345678901234567890abcdef1234567890abcdef123456","logIndex":"0","contractAddress":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","eventName":"Transfer"}},"WalletActivityEventBase":{"type":"object","description":"Common fields included in every wallet activity webhook event payload.","properties":{"eventId":{"type":"string","format":"uuid","description":"Unique identifier for this webhook event. Use this for idempotency.","example":"123e4567-e89b-12d3-a456-426614174000"},"timestamp":{"type":"string","format":"date-time","description":"When this event occurred (ISO 8601 format).","example":"2025-06-01T12:00:00Z"},"data":{"$ref":"#/components/schemas/OnchainActivityEventData"}},"required":["eventId","timestamp","data"]},"WalletActivityDetectedEvent":{"x-event-type":"wallet.activity.detected","allOf":[{"$ref":"#/components/schemas/WalletActivityEventBase"},{"type":"object","properties":{"eventType":{"type":"string","description":"The type of webhook event.","enum":["wallet.activity.detected"],"example":"wallet.activity.detected"}},"required":["eventType"]}]},"WalletActivityMultiEvent":{"x-event-type":"wallet.activity.multi","allOf":[{"$ref":"#/components/schemas/WalletActivityEventBase"},{"type":"object","properties":{"eventType":{"type":"string","description":"The type of webhook event.","enum":["wallet.activity.multi"],"example":"wallet.activity.multi"}},"required":["eventType"]}]},"WalletEvmTransactionCreatedPayload":{"type":"object","description":"Payload for `wallet.transaction.created` on EVM networks. Includes the originating `address`.","properties":{"address":{"allOf":[{"$ref":"#/components/schemas/BlockchainAddress"}],"pattern":"^0x[0-9a-fA-F]{40}$","description":"The EVM wallet address that created the transaction.","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"},"network":{"allOf":[{"$ref":"#/components/schemas/Network"}],"description":"The blockchain network identifier.","example":"base"},"created_at":{"type":"string","format":"date-time","description":"When the transaction was created (ISO 8601 format).","example":"2025-06-01T10:00:00Z"}},"required":["address","network","created_at"]},"WalletApiKeyEventPayload":{"type":"object","description":"Payload for API Key Wallet events. These events carry no end-user payload fields, so neither `user_id` nor `delegation_id` is present.","not":{"anyOf":[{"required":["user_id"]},{"required":["delegation_id"]}]}},"WalletSolanaTransactionCreatedPayload":{"type":"object","description":"Payload for `wallet.transaction.created` on Solana. Solana transaction events do not include an `address`.","properties":{"network":{"allOf":[{"$ref":"#/components/schemas/Network"}],"description":"The blockchain network identifier.","example":"solana"},"created_at":{"type":"string","format":"date-time","description":"When the transaction was created (ISO 8601 format).","example":"2025-06-01T10:00:00Z"}},"required":["network","created_at"],"not":{"required":["address"]}},"WalletUserEventPayload":{"type":"object","description":"Payload for User Wallet events. The wallet is owned by an end user, identified by `user_id`. User Wallet actions do not include `delegation_id`.","properties":{"user_id":{"type":"string","description":"The user ID that owns the User Wallet.","example":"user_12345"}},"required":["user_id"],"not":{"required":["delegation_id"]}},"WalletDelegatedEventPayload":{"type":"object","description":"Payload for delegated User Wallet events, where a User Wallet action was authorized via a delegation grant. Includes `user_id` and the `delegation_id` of the active grant.","properties":{"user_id":{"type":"string","description":"The user ID that owns the User Wallet.","example":"user_12345"},"delegation_id":{"type":"string","description":"The delegation grant ID used to authorize the action.","example":"delegation_af2937b0-9846-4fe7-bfe9-ccc22d935114"}},"required":["user_id","delegation_id"]},"WalletTransactionCreatedEvent":{"x-event-type":"wallet.transaction.created","description":"Delivered when a transaction is created. The payload is one of six variants: API Key Wallet, User Wallet, or User Wallet (Delegated Signing), each delivered as an EVM or Solana variant.","oneOf":[{"title":"API Key Wallet (EVM)","allOf":[{"$ref":"#/components/schemas/WalletEvmTransactionCreatedPayload"},{"$ref":"#/components/schemas/WalletApiKeyEventPayload"}]},{"title":"API Key Wallet (Solana)","allOf":[{"$ref":"#/components/schemas/WalletSolanaTransactionCreatedPayload"},{"$ref":"#/components/schemas/WalletApiKeyEventPayload"}]},{"title":"User Wallet (EVM)","allOf":[{"$ref":"#/components/schemas/WalletEvmTransactionCreatedPayload"},{"$ref":"#/components/schemas/WalletUserEventPayload"}]},{"title":"User Wallet (Solana)","allOf":[{"$ref":"#/components/schemas/WalletSolanaTransactionCreatedPayload"},{"$ref":"#/components/schemas/WalletUserEventPayload"}]},{"title":"User Wallet (Delegated Signing, EVM)","allOf":[{"$ref":"#/components/schemas/WalletEvmTransactionCreatedPayload"},{"$ref":"#/components/schemas/WalletDelegatedEventPayload"}]},{"title":"User Wallet (Delegated Signing, Solana)","allOf":[{"$ref":"#/components/schemas/WalletSolanaTransactionCreatedPayload"},{"$ref":"#/components/schemas/WalletDelegatedEventPayload"}]}]},"WalletEvmSigningPayload":{"type":"object","description":"Payload for EVM wallet signing events. Carries the EVM signing `address` and timestamp; no network or transaction identifier.","properties":{"address":{"allOf":[{"$ref":"#/components/schemas/BlockchainAddress"}],"pattern":"^0x[0-9a-fA-F]{40}$","description":"The EVM wallet address that performed the signing.","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"},"signed_at":{"type":"string","format":"date-time","description":"When the signing occurred (ISO 8601 format).","example":"2025-06-01T10:01:00Z"}},"required":["address","signed_at"]},"WalletSolanaSigningPayload":{"type":"object","description":"Payload for Solana wallet signing events. Carries the Solana signing `address` and timestamp; no network or transaction identifier.","properties":{"address":{"allOf":[{"$ref":"#/components/schemas/BlockchainAddress"}],"pattern":"^[1-9A-HJ-NP-Za-km-z]{32,44}$","description":"The Solana wallet address that performed the signing.","example":"HN7cABqLq46Es1jh92dQQisAq662SmxELLLsHHe4YWrH"},"signed_at":{"type":"string","format":"date-time","description":"When the signing occurred (ISO 8601 format).","example":"2025-06-01T10:01:00Z"}},"required":["address","signed_at"]},"WalletTransactionSignedEvent":{"x-event-type":"wallet.transaction.signed","description":"Delivered when a transaction is signed. Emitted for both EVM and Solana wallets. The payload is one of six variants: API Key Wallet, User Wallet, or User Wallet (Delegated Signing), each delivered as an EVM or Solana variant.","oneOf":[{"title":"API Key Wallet (EVM)","allOf":[{"$ref":"#/components/schemas/WalletEvmSigningPayload"},{"$ref":"#/components/schemas/WalletApiKeyEventPayload"}]},{"title":"API Key Wallet (Solana)","allOf":[{"$ref":"#/components/schemas/WalletSolanaSigningPayload"},{"$ref":"#/components/schemas/WalletApiKeyEventPayload"}]},{"title":"User Wallet (EVM)","allOf":[{"$ref":"#/components/schemas/WalletEvmSigningPayload"},{"$ref":"#/components/schemas/WalletUserEventPayload"}]},{"title":"User Wallet (Solana)","allOf":[{"$ref":"#/components/schemas/WalletSolanaSigningPayload"},{"$ref":"#/components/schemas/WalletUserEventPayload"}]},{"title":"User Wallet (Delegated Signing, EVM)","allOf":[{"$ref":"#/components/schemas/WalletEvmSigningPayload"},{"$ref":"#/components/schemas/WalletDelegatedEventPayload"}]},{"title":"User Wallet (Delegated Signing, Solana)","allOf":[{"$ref":"#/components/schemas/WalletSolanaSigningPayload"},{"$ref":"#/components/schemas/WalletDelegatedEventPayload"}]}]},"WalletEvmTransactionBroadcastPayload":{"type":"object","description":"Payload for `wallet.transaction.broadcast` on EVM networks. Includes `transaction_hash` and `address`.","properties":{"transaction_hash":{"type":"string","description":"The onchain transaction hash.","example":"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"},"address":{"allOf":[{"$ref":"#/components/schemas/BlockchainAddress"}],"pattern":"^0x[0-9a-fA-F]{40}$","description":"The EVM wallet address that broadcast the transaction.","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"},"network":{"allOf":[{"$ref":"#/components/schemas/Network"}],"description":"The blockchain network identifier.","example":"base"},"broadcast_at":{"type":"string","format":"date-time","description":"When the transaction was broadcast (ISO 8601 format).","example":"2025-06-01T10:02:00Z"}},"required":["transaction_hash","address","network","broadcast_at"]},"WalletSolanaTransactionBroadcastPayload":{"type":"object","description":"Payload for `wallet.transaction.broadcast` on Solana. Includes `transaction_signature` and omits `address`.","properties":{"transaction_signature":{"type":"string","description":"The Solana transaction signature.","example":"5KtPn1LGuxhFiwjxErkxTb3BeHaGShVbirtk7vrWgEiaTaKKQSGkLmMX7vLBMA4oL9pGikhmL6K2Uf4VNBLEmmnF"},"network":{"allOf":[{"$ref":"#/components/schemas/Network"}],"description":"The blockchain network identifier.","example":"solana"},"broadcast_at":{"type":"string","format":"date-time","description":"When the transaction was broadcast (ISO 8601 format).","example":"2025-06-01T10:02:00Z"}},"required":["transaction_signature","network","broadcast_at"]},"WalletTransactionBroadcastEvent":{"x-event-type":"wallet.transaction.broadcast","description":"Delivered when a transaction is broadcast to the network. The payload is one of six variants: API Key Wallet, User Wallet, or User Wallet (Delegated Signing), each delivered as an EVM or Solana variant.","oneOf":[{"title":"API Key Wallet (EVM)","allOf":[{"$ref":"#/components/schemas/WalletEvmTransactionBroadcastPayload"},{"$ref":"#/components/schemas/WalletApiKeyEventPayload"}]},{"title":"API Key Wallet (Solana)","allOf":[{"$ref":"#/components/schemas/WalletSolanaTransactionBroadcastPayload"},{"$ref":"#/components/schemas/WalletApiKeyEventPayload"}]},{"title":"User Wallet (EVM)","allOf":[{"$ref":"#/components/schemas/WalletEvmTransactionBroadcastPayload"},{"$ref":"#/components/schemas/WalletUserEventPayload"}]},{"title":"User Wallet (Solana)","allOf":[{"$ref":"#/components/schemas/WalletSolanaTransactionBroadcastPayload"},{"$ref":"#/components/schemas/WalletUserEventPayload"}]},{"title":"User Wallet (Delegated Signing, EVM)","allOf":[{"$ref":"#/components/schemas/WalletEvmTransactionBroadcastPayload"},{"$ref":"#/components/schemas/WalletDelegatedEventPayload"}]},{"title":"User Wallet (Delegated Signing, Solana)","allOf":[{"$ref":"#/components/schemas/WalletSolanaTransactionBroadcastPayload"},{"$ref":"#/components/schemas/WalletDelegatedEventPayload"}]}]},"WalletTransactionReplacedPayload":{"type":"object","description":"Payload for `wallet.transaction.replaced`. EVM-only; Solana transactions are not replaceable.","properties":{"transaction_hash":{"type":"string","description":"The onchain transaction hash of the replaced transaction.","example":"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"},"address":{"allOf":[{"$ref":"#/components/schemas/BlockchainAddress"}],"pattern":"^0x[0-9a-fA-F]{40}$","description":"The EVM wallet address whose transaction was replaced.","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"},"network":{"allOf":[{"$ref":"#/components/schemas/Network"}],"description":"The blockchain network identifier.","example":"base"},"replaced_at":{"type":"string","format":"date-time","description":"When the transaction was replaced (ISO 8601 format).","example":"2025-06-01T10:03:00Z"}},"required":["transaction_hash","address","network","replaced_at"]},"WalletTransactionReplacedEvent":{"x-event-type":"wallet.transaction.replaced","description":"Delivered when a pending transaction is replaced (e.g. a fee bump). EVM-only. The payload is one of three EVM wallet-type variants: API Key Wallet, User Wallet, or User Wallet (Delegated Signing).","oneOf":[{"title":"API Key Wallet","allOf":[{"$ref":"#/components/schemas/WalletTransactionReplacedPayload"},{"$ref":"#/components/schemas/WalletApiKeyEventPayload"}]},{"title":"User Wallet","allOf":[{"$ref":"#/components/schemas/WalletTransactionReplacedPayload"},{"$ref":"#/components/schemas/WalletUserEventPayload"}]},{"title":"User Wallet (Delegated Signing)","allOf":[{"$ref":"#/components/schemas/WalletTransactionReplacedPayload"},{"$ref":"#/components/schemas/WalletDelegatedEventPayload"}]}]},"WalletTransactionPendingPayload":{"type":"object","description":"Payload for `wallet.transaction.pending`. EVM-only. EIP-1559 fee fields are included.","properties":{"transaction_hash":{"type":"string","description":"The onchain transaction hash.","example":"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"},"address":{"allOf":[{"$ref":"#/components/schemas/BlockchainAddress"}],"pattern":"^0x[0-9a-fA-F]{40}$","description":"The EVM wallet address whose transaction is pending.","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"},"network":{"allOf":[{"$ref":"#/components/schemas/Network"}],"description":"The blockchain network identifier.","example":"base"},"pending_since":{"type":"string","format":"date-time","description":"When the transaction entered the pending state (ISO 8601 format).","example":"2025-06-01T10:04:00Z"},"max_fee_per_gas":{"type":"string","description":"EIP-1559 max fee per gas in wei.","example":"30000000000"},"max_priority_fee_per_gas":{"type":"string","description":"EIP-1559 max priority fee per gas in wei.","example":"1500000000"}},"required":["transaction_hash","address","network","pending_since","max_fee_per_gas","max_priority_fee_per_gas"]},"WalletTransactionPendingEvent":{"x-event-type":"wallet.transaction.pending","description":"Delivered when a transaction enters the pending state. EVM-only. The payload is one of three EVM wallet-type variants: API Key Wallet, User Wallet, or User Wallet (Delegated Signing).","oneOf":[{"title":"API Key Wallet","allOf":[{"$ref":"#/components/schemas/WalletTransactionPendingPayload"},{"$ref":"#/components/schemas/WalletApiKeyEventPayload"}]},{"title":"User Wallet","allOf":[{"$ref":"#/components/schemas/WalletTransactionPendingPayload"},{"$ref":"#/components/schemas/WalletUserEventPayload"}]},{"title":"User Wallet (Delegated Signing)","allOf":[{"$ref":"#/components/schemas/WalletTransactionPendingPayload"},{"$ref":"#/components/schemas/WalletDelegatedEventPayload"}]}]},"WalletEvmTransactionConfirmedPayload":{"type":"object","description":"Payload for `wallet.transaction.confirmed` on EVM networks. Includes `transaction_hash` and `address`.","properties":{"transaction_hash":{"type":"string","description":"The onchain transaction hash.","example":"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"},"address":{"allOf":[{"$ref":"#/components/schemas/BlockchainAddress"}],"pattern":"^0x[0-9a-fA-F]{40}$","description":"The EVM wallet address that submitted the transaction.","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"},"network":{"allOf":[{"$ref":"#/components/schemas/Network"}],"description":"The blockchain network identifier.","example":"base"},"confirmed_at":{"type":"string","format":"date-time","description":"When the transaction was confirmed (ISO 8601 format).","example":"2025-06-01T10:05:00Z"}},"required":["transaction_hash","address","network","confirmed_at"]},"WalletSolanaTransactionConfirmedPayload":{"type":"object","description":"Payload for `wallet.transaction.confirmed` on Solana. Includes `transaction_signature` and omits `address`.","properties":{"transaction_signature":{"type":"string","description":"The Solana transaction signature.","example":"5KtPn1LGuxhFiwjxErkxTb3BeHaGShVbirtk7vrWgEiaTaKKQSGkLmMX7vLBMA4oL9pGikhmL6K2Uf4VNBLEmmnF"},"network":{"allOf":[{"$ref":"#/components/schemas/Network"}],"description":"The blockchain network identifier.","example":"solana"},"confirmed_at":{"type":"string","format":"date-time","description":"When the transaction was confirmed (ISO 8601 format).","example":"2025-06-01T10:05:00Z"}},"required":["transaction_signature","network","confirmed_at"]},"WalletTransactionConfirmedEvent":{"x-event-type":"wallet.transaction.confirmed","description":"Delivered when a transaction is confirmed onchain. The payload is one of six variants: API Key Wallet, User Wallet, or User Wallet (Delegated Signing), each delivered as an EVM or Solana variant.","oneOf":[{"title":"API Key Wallet (EVM)","allOf":[{"$ref":"#/components/schemas/WalletEvmTransactionConfirmedPayload"},{"$ref":"#/components/schemas/WalletApiKeyEventPayload"}]},{"title":"API Key Wallet (Solana)","allOf":[{"$ref":"#/components/schemas/WalletSolanaTransactionConfirmedPayload"},{"$ref":"#/components/schemas/WalletApiKeyEventPayload"}]},{"title":"User Wallet (EVM)","allOf":[{"$ref":"#/components/schemas/WalletEvmTransactionConfirmedPayload"},{"$ref":"#/components/schemas/WalletUserEventPayload"}]},{"title":"User Wallet (Solana)","allOf":[{"$ref":"#/components/schemas/WalletSolanaTransactionConfirmedPayload"},{"$ref":"#/components/schemas/WalletUserEventPayload"}]},{"title":"User Wallet (Delegated Signing, EVM)","allOf":[{"$ref":"#/components/schemas/WalletEvmTransactionConfirmedPayload"},{"$ref":"#/components/schemas/WalletDelegatedEventPayload"}]},{"title":"User Wallet (Delegated Signing, Solana)","allOf":[{"$ref":"#/components/schemas/WalletSolanaTransactionConfirmedPayload"},{"$ref":"#/components/schemas/WalletDelegatedEventPayload"}]}]},"WalletEvmTransactionFailedPayload":{"type":"object","description":"Payload for `wallet.transaction.failed` on EVM networks. Includes `transaction_hash` and `address`.","properties":{"transaction_hash":{"type":"string","description":"The onchain transaction hash.","example":"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"},"address":{"allOf":[{"$ref":"#/components/schemas/BlockchainAddress"}],"pattern":"^0x[0-9a-fA-F]{40}$","description":"The EVM wallet address that submitted the transaction.","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"},"network":{"allOf":[{"$ref":"#/components/schemas/Network"}],"description":"The blockchain network identifier.","example":"base"},"failed_at":{"type":"string","format":"date-time","description":"When the transaction failed (ISO 8601 format).","example":"2025-06-01T10:06:00Z"}},"required":["transaction_hash","address","network","failed_at"]},"WalletSolanaTransactionFailedPayload":{"type":"object","description":"Payload for `wallet.transaction.failed` on Solana. Includes `transaction_signature` and omits `address`.","properties":{"transaction_signature":{"type":"string","description":"The Solana transaction signature.","example":"5KtPn1LGuxhFiwjxErkxTb3BeHaGShVbirtk7vrWgEiaTaKKQSGkLmMX7vLBMA4oL9pGikhmL6K2Uf4VNBLEmmnF"},"network":{"allOf":[{"$ref":"#/components/schemas/Network"}],"description":"The blockchain network identifier.","example":"solana"},"failed_at":{"type":"string","format":"date-time","description":"When the transaction failed (ISO 8601 format).","example":"2025-06-01T10:06:00Z"}},"required":["transaction_signature","network","failed_at"]},"WalletTransactionFailedEvent":{"x-event-type":"wallet.transaction.failed","description":"Delivered when a transaction fails. The payload is one of six variants: API Key Wallet, User Wallet, or User Wallet (Delegated Signing), each delivered as an EVM or Solana variant.","oneOf":[{"title":"API Key Wallet (EVM)","allOf":[{"$ref":"#/components/schemas/WalletEvmTransactionFailedPayload"},{"$ref":"#/components/schemas/WalletApiKeyEventPayload"}]},{"title":"API Key Wallet (Solana)","allOf":[{"$ref":"#/components/schemas/WalletSolanaTransactionFailedPayload"},{"$ref":"#/components/schemas/WalletApiKeyEventPayload"}]},{"title":"User Wallet (EVM)","allOf":[{"$ref":"#/components/schemas/WalletEvmTransactionFailedPayload"},{"$ref":"#/components/schemas/WalletUserEventPayload"}]},{"title":"User Wallet (Solana)","allOf":[{"$ref":"#/components/schemas/WalletSolanaTransactionFailedPayload"},{"$ref":"#/components/schemas/WalletUserEventPayload"}]},{"title":"User Wallet (Delegated Signing, EVM)","allOf":[{"$ref":"#/components/schemas/WalletEvmTransactionFailedPayload"},{"$ref":"#/components/schemas/WalletDelegatedEventPayload"}]},{"title":"User Wallet (Delegated Signing, Solana)","allOf":[{"$ref":"#/components/schemas/WalletSolanaTransactionFailedPayload"},{"$ref":"#/components/schemas/WalletDelegatedEventPayload"}]}]},"WalletDelegationCreatedEvent":{"type":"object","x-event-type":"wallet.delegation.created","description":"Delivered when a delegation grant is created for a User Wallet.","properties":{"delegation_id":{"type":"string","description":"The unique identifier for the delegation grant.","example":"delegation_af2937b0-9846-4fe7-bfe9-ccc22d935114"},"user_id":{"type":"string","description":"The user ID that owns the delegation.","example":"user_12345"},"expires_at":{"type":"string","format":"date-time","description":"When the delegation expires (ISO 8601 format).","example":"2025-07-01T10:00:00Z"},"created_at":{"type":"string","format":"date-time","description":"When the delegation was created (ISO 8601 format).","example":"2025-06-01T10:00:00Z"}},"required":["delegation_id","user_id","expires_at","created_at"],"example":{"delegation_id":"delegation_af2937b0-9846-4fe7-bfe9-ccc22d935114","user_id":"user_12345","expires_at":"2025-07-01T10:00:00Z","created_at":"2025-06-01T10:00:00Z"}},"WalletDelegationRevokedEvent":{"type":"object","x-event-type":"wallet.delegation.revoked","description":"Delivered when a delegation grant is revoked.","properties":{"delegation_id":{"type":"string","description":"The unique identifier for the delegation grant.","example":"delegation_af2937b0-9846-4fe7-bfe9-ccc22d935114"},"user_id":{"type":"string","description":"The user ID that owns the delegation.","example":"user_12345"},"revoked_at":{"type":"string","format":"date-time","description":"When the delegation was revoked (ISO 8601 format).","example":"2025-06-01T11:00:00Z"}},"required":["delegation_id","user_id","revoked_at"],"example":{"delegation_id":"delegation_af2937b0-9846-4fe7-bfe9-ccc22d935114","user_id":"user_12345","revoked_at":"2025-06-01T11:00:00Z"}},"WalletTypedDataSignedEvent":{"x-event-type":"wallet.typed_data.signed","description":"Delivered when EIP-712 typed data is signed. EVM-only. Uses the EVM signing payload. The payload is one of three EVM wallet-type variants: API Key Wallet, User Wallet, or User Wallet (Delegated Signing).","oneOf":[{"title":"API Key Wallet","allOf":[{"$ref":"#/components/schemas/WalletEvmSigningPayload"},{"$ref":"#/components/schemas/WalletApiKeyEventPayload"}]},{"title":"User Wallet","allOf":[{"$ref":"#/components/schemas/WalletEvmSigningPayload"},{"$ref":"#/components/schemas/WalletUserEventPayload"}]},{"title":"User Wallet (Delegated Signing)","allOf":[{"$ref":"#/components/schemas/WalletEvmSigningPayload"},{"$ref":"#/components/schemas/WalletDelegatedEventPayload"}]}]},"WalletMessageSignedEvent":{"x-event-type":"wallet.message.signed","description":"Delivered when a message is signed. Emitted for both EVM and Solana wallets. The payload is one of six variants: API Key Wallet, User Wallet, or User Wallet (Delegated Signing), each delivered as an EVM or Solana variant.","oneOf":[{"title":"API Key Wallet (EVM)","allOf":[{"$ref":"#/components/schemas/WalletEvmSigningPayload"},{"$ref":"#/components/schemas/WalletApiKeyEventPayload"}]},{"title":"API Key Wallet (Solana)","allOf":[{"$ref":"#/components/schemas/WalletSolanaSigningPayload"},{"$ref":"#/components/schemas/WalletApiKeyEventPayload"}]},{"title":"User Wallet (EVM)","allOf":[{"$ref":"#/components/schemas/WalletEvmSigningPayload"},{"$ref":"#/components/schemas/WalletUserEventPayload"}]},{"title":"User Wallet (Solana)","allOf":[{"$ref":"#/components/schemas/WalletSolanaSigningPayload"},{"$ref":"#/components/schemas/WalletUserEventPayload"}]},{"title":"User Wallet (Delegated Signing, EVM)","allOf":[{"$ref":"#/components/schemas/WalletEvmSigningPayload"},{"$ref":"#/components/schemas/WalletDelegatedEventPayload"}]},{"title":"User Wallet (Delegated Signing, Solana)","allOf":[{"$ref":"#/components/schemas/WalletSolanaSigningPayload"},{"$ref":"#/components/schemas/WalletDelegatedEventPayload"}]}]},"WalletHashSignedEvent":{"x-event-type":"wallet.hash.signed","description":"Delivered when a raw hash is signed. Emitted for both EVM and Solana wallets. The payload is one of six variants: API Key Wallet, User Wallet, or User Wallet (Delegated Signing), each delivered as an EVM or Solana variant.","oneOf":[{"title":"API Key Wallet (EVM)","allOf":[{"$ref":"#/components/schemas/WalletEvmSigningPayload"},{"$ref":"#/components/schemas/WalletApiKeyEventPayload"}]},{"title":"API Key Wallet (Solana)","allOf":[{"$ref":"#/components/schemas/WalletSolanaSigningPayload"},{"$ref":"#/components/schemas/WalletApiKeyEventPayload"}]},{"title":"User Wallet (EVM)","allOf":[{"$ref":"#/components/schemas/WalletEvmSigningPayload"},{"$ref":"#/components/schemas/WalletUserEventPayload"}]},{"title":"User Wallet (Solana)","allOf":[{"$ref":"#/components/schemas/WalletSolanaSigningPayload"},{"$ref":"#/components/schemas/WalletUserEventPayload"}]},{"title":"User Wallet (Delegated Signing, EVM)","allOf":[{"$ref":"#/components/schemas/WalletEvmSigningPayload"},{"$ref":"#/components/schemas/WalletDelegatedEventPayload"}]},{"title":"User Wallet (Delegated Signing, Solana)","allOf":[{"$ref":"#/components/schemas/WalletSolanaSigningPayload"},{"$ref":"#/components/schemas/WalletDelegatedEventPayload"}]}]},"PaymentsTransfersEventBase":{"type":"object","description":"Common envelope fields included in every payments transfers webhook event payload.","properties":{"eventID":{"type":"string","format":"uuid","description":"Unique identifier for this webhook event. Use this for idempotency.","example":"123e4567-e89b-12d3-a456-426614174000"},"eventType":{"type":"string","description":"The type of webhook event.","example":"payments.transfers.completed"},"timestamp":{"type":"string","format":"date-time","description":"The UTC ISO 8601 timestamp at which the underlying state change occurred, not the time at which this webhook was delivered.","example":"2026-01-01T00:05:00Z"},"data":{"$ref":"#/components/schemas/Transfer"}},"required":["eventID","eventType","timestamp","data"]},"PaymentsTransfersQuotedEvent":{"x-event-type":"payments.transfers.quoted","allOf":[{"$ref":"#/components/schemas/PaymentsTransfersEventBase"},{"type":"object","properties":{"eventType":{"type":"string","description":"The type of webhook event.","enum":["payments.transfers.quoted"],"example":"payments.transfers.quoted"}},"required":["eventType"]}]},"PaymentsTransfersProcessingEvent":{"x-event-type":"payments.transfers.processing","allOf":[{"$ref":"#/components/schemas/PaymentsTransfersEventBase"},{"type":"object","properties":{"eventType":{"type":"string","description":"The type of webhook event.","enum":["payments.transfers.processing"],"example":"payments.transfers.processing"}},"required":["eventType"]}]},"PaymentsTransfersCompletedEvent":{"x-event-type":"payments.transfers.completed","allOf":[{"$ref":"#/components/schemas/PaymentsTransfersEventBase"},{"type":"object","properties":{"eventType":{"type":"string","description":"The type of webhook event.","enum":["payments.transfers.completed"],"example":"payments.transfers.completed"}},"required":["eventType"]}]},"PaymentsTransfersFailedEvent":{"x-event-type":"payments.transfers.failed","allOf":[{"$ref":"#/components/schemas/PaymentsTransfersEventBase"},{"type":"object","properties":{"eventType":{"type":"string","description":"The type of webhook event.","enum":["payments.transfers.failed"],"example":"payments.transfers.failed"}},"required":["eventType"]}]},"PaymentsTransfersExpiredEvent":{"x-event-type":"payments.transfers.expired","allOf":[{"$ref":"#/components/schemas/PaymentsTransfersEventBase"},{"type":"object","properties":{"eventType":{"type":"string","description":"The type of webhook event.","enum":["payments.transfers.expired"],"example":"payments.transfers.expired"}},"required":["eventType"]}]},"PaymentsTransfersTravelRuleIncompleteEvent":{"x-event-type":"payments.transfers.travel_rule_incomplete","allOf":[{"$ref":"#/components/schemas/PaymentsTransfersEventBase"},{"type":"object","properties":{"eventType":{"type":"string","description":"The type of webhook event.","enum":["payments.transfers.travel_rule_incomplete"],"example":"payments.transfers.travel_rule_incomplete"}},"required":["eventType"]}]},"PaymentsTransfersTravelRuleCompletedEvent":{"x-event-type":"payments.transfers.travel_rule_completed","allOf":[{"$ref":"#/components/schemas/PaymentsTransfersEventBase"},{"type":"object","properties":{"eventType":{"type":"string","description":"The type of webhook event.","enum":["payments.transfers.travel_rule_completed"],"example":"payments.transfers.travel_rule_completed"}},"required":["eventType"]}]},"MoneyAmount":{"type":"object","description":"A monetary amount with currency.","properties":{"currency":{"type":"string","description":"Currency code (e.g., \"USD\", \"USDC\", \"ETH\").","example":"USD"},"value":{"type":"string","description":"The amount as a string.","example":"100.00"}},"required":["currency","value"],"example":{"currency":"USD","value":"5.00"}},"OnrampTransactionPayload":{"type":"object","description":"Webhook payload for standard onramp transactions (guest checkout and authed flow). Serialized from the OnrampTransaction proto via protojson with eventType appended.","properties":{"eventType":{"type":"string","description":"The webhook event type.","example":"onramp.transaction.updated"},"transactionId":{"type":"string","description":"Unique transaction identifier.","example":"1f087a54-ff1f-62e8-9f85-aa77ac0499a5"},"status":{"type":"string","description":"Current status of the transaction.","enum":["ONRAMP_TRANSACTION_STATUS_UNSPECIFIED","ONRAMP_TRANSACTION_STATUS_CREATED","ONRAMP_TRANSACTION_STATUS_IN_PROGRESS","ONRAMP_TRANSACTION_STATUS_SUCCESS","ONRAMP_TRANSACTION_STATUS_FAILED","ONRAMP_TRANSACTION_STATUS_AWAITING_AUTH","ONRAMP_TRANSACTION_STATUS_AWAITING_PAYMENT"],"example":"ONRAMP_TRANSACTION_STATUS_IN_PROGRESS"},"purchaseCurrency":{"type":"string","description":"The crypto currency purchased (e.g., \"USDC\", \"ETH\").","example":"USDC"},"purchaseNetwork":{"type":"string","description":"The blockchain network for the purchase (e.g., \"ethereum\", \"base\").","example":"ethereum"},"purchaseAmount":{"$ref":"#/components/schemas/MoneyAmount"},"paymentTotal":{"$ref":"#/components/schemas/MoneyAmount"},"paymentTotalUsd":{"$ref":"#/components/schemas/MoneyAmount"},"paymentSubtotal":{"$ref":"#/components/schemas/MoneyAmount"},"coinbaseFee":{"$ref":"#/components/schemas/MoneyAmount"},"networkFee":{"$ref":"#/components/schemas/MoneyAmount"},"exchangeRate":{"$ref":"#/components/schemas/MoneyAmount"},"txHash":{"type":"string","description":"The onchain transaction hash of the send (0x-prefixed for EVM).","example":"0x"},"createdAt":{"type":"string","format":"date-time","description":"When the transaction was created.","example":"2025-09-02T02:34:13Z"},"completedAt":{"type":"string","format":"date-time","description":"When the transaction completed (uses send_started_at for early success).","example":"0001-01-01T00:00:00Z"},"country":{"type":"string","description":"The user's country code.","example":"US"},"userId":{"type":"string","description":"Hashed user identifier (entity hash for guest, user ID for authed).","example":"4132b63ee21128686458155b28570289"},"paymentMethod":{"type":"string","description":"The payment method used.","enum":["UNSPECIFIED","CARD","ACH_BANK_ACCOUNT","APPLE_PAY","FIAT_WALLET","CRYPTO_ACCOUNT","GUEST_CHECKOUT_CARD","PAYPAL","RTP","GUEST_CHECKOUT_APPLE_PAY","GUEST_CHECKOUT_GOOGLE_PAY"],"example":"CARD"},"walletAddress":{"type":"string","description":"The destination wallet address.","example":"0xe0512E358C347cc2b1A42d057065CE642068b7Ba"},"type":{"type":"string","description":"The type of onramp transaction.","enum":["ONRAMP_TRANSACTION_TYPE_UNSPECIFIED","ONRAMP_TRANSACTION_TYPE_BUY_AND_SEND","ONRAMP_TRANSACTION_TYPE_SEND"],"example":"ONRAMP_TRANSACTION_TYPE_BUY_AND_SEND"},"userType":{"type":"string","description":"Whether the user is authed or guest.","enum":["USER_TYPE_UNSPECIFIED","USER_TYPE_AUTHED","USER_TYPE_GUEST"],"example":"USER_TYPE_GUEST"},"partnerUserRef":{"type":"string","description":"The partnerUserId provided when initializing the onramp session.","example":"example_user_ref"},"contractAddress":{"type":"string","description":"The token contract address (populated when asset metadata is available).","example":""},"failureReason":{"type":"string","description":"The reason for failure (if applicable).","enum":["FAILURE_REASON_UNSPECIFIED","FAILURE_REASON_BUY_FAILED","FAILURE_REASON_SEND_FAILED"],"example":"FAILURE_REASON_UNSPECIFIED"},"endPartnerName":{"type":"string","description":"The name of the developer app.","example":""},"errorCode":{"type":"string","description":"Error code for the transaction failure (if applicable).","example":"ERROR_CODE_UNSPECIFIED"}},"required":["eventType","transactionId","status"]},"OrderFee":{"type":"object","description":"A fee associated with a Headless Onramp API order.","properties":{"feeType":{"type":"string","description":"The type of fee.","enum":["FEE_TYPE_UNSPECIFIED","FEE_TYPE_NETWORK","FEE_TYPE_EXCHANGE"],"example":"FEE_TYPE_NETWORK"},"feeAmount":{"type":"string","description":"The amount of the fee.","example":"0.5"},"feeCurrency":{"type":"string","description":"The currency of the fee.","example":"USD"}}},"OnrampOrderPayload":{"type":"object","description":"Webhook payload for Headless Onramp API orders (Apple Pay / Google Pay). Serialized from the OnrampOrder proto via protojson with eventType appended.","properties":{"eventType":{"type":"string","description":"The webhook event type.","example":"onramp.transaction.success"},"orderId":{"type":"string","format":"uuid","description":"Unique order identifier.","example":"123e4567-e89b-12d3-a456-426614174000"},"paymentTotal":{"type":"string","description":"The total fiat amount paid.","example":"100.75"},"paymentSubtotal":{"type":"string","description":"The fiat amount converted to crypto (excluding fees).","example":"100"},"paymentCurrency":{"type":"string","description":"The fiat currency used for payment.","example":"USD"},"paymentMethod":{"type":"string","description":"The payment method used.","enum":["UNSPECIFIED","CARD","ACH_BANK_ACCOUNT","APPLE_PAY","FIAT_WALLET","CRYPTO_ACCOUNT","GUEST_CHECKOUT_CARD","PAYPAL","RTP","GUEST_CHECKOUT_APPLE_PAY","GUEST_CHECKOUT_GOOGLE_PAY"],"example":"GUEST_CHECKOUT_APPLE_PAY"},"purchaseAmount":{"type":"string","description":"The amount of crypto purchased.","example":"100.000000"},"purchaseCurrency":{"type":"string","description":"The crypto currency purchased.","example":"USDC"},"fees":{"type":"array","description":"Breakdown of fees for the order.","items":{"$ref":"#/components/schemas/OrderFee"},"example":[{"feeType":"FEE_TYPE_NETWORK","feeAmount":"0.5","feeCurrency":"USD"},{"feeType":"FEE_TYPE_EXCHANGE","feeAmount":"0.25","feeCurrency":"USD"}]},"exchangeRate":{"type":"string","description":"The exchange rate used for conversion.","example":"1"},"destinationAddress":{"type":"string","description":"The destination wallet address.","example":"0x1234567890abcdef1234567890abcdef12345678"},"destinationNetwork":{"type":"string","description":"The blockchain network for delivery.","example":"base"},"status":{"type":"string","description":"The status of the order.","enum":["ONRAMP_ORDER_STATUS_UNSPECIFIED","ONRAMP_ORDER_STATUS_PENDING_AUTH","ONRAMP_ORDER_STATUS_PENDING_PAYMENT","ONRAMP_ORDER_STATUS_PROCESSING","ONRAMP_ORDER_STATUS_COMPLETED","ONRAMP_ORDER_STATUS_FAILED"],"example":"ONRAMP_ORDER_STATUS_COMPLETED"},"txHash":{"type":"string","description":"The onchain transaction hash (available once crypto is sent).","example":"0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890"},"createdAt":{"type":"string","format":"date-time","description":"When the order was created.","example":"2025-09-10T10:30:00Z"},"updatedAt":{"type":"string","format":"date-time","description":"When the order was last updated.","example":"2025-09-10T10:35:00Z"},"partnerUserRef":{"type":"string","description":"The partner user reference ID.","example":"example_user_ref"}},"required":["eventType","orderId","status"]},"OnrampTransactionEvent":{"description":"Webhook payload for all onramp transaction events (created, updated, success, failed). Shape depends on transaction type — standard flow (guest checkout / authorized) uses OnrampTransactionPayload, Headless API (Apple Pay / Google Pay) uses OnrampOrderPayload. Distinguish by presence of `orderId` (Headless) vs `transactionId` (standard).","oneOf":[{"$ref":"#/components/schemas/OnrampTransactionPayload"},{"$ref":"#/components/schemas/OnrampOrderPayload"}]},"OnrampTransactionCreatedEvent":{"x-event-type":"onramp.transaction.created","allOf":[{"$ref":"#/components/schemas/OnrampTransactionEvent"}]},"OnrampTransactionUpdatedEvent":{"x-event-type":"onramp.transaction.updated","allOf":[{"$ref":"#/components/schemas/OnrampTransactionEvent"}]},"OnrampTransactionSuccessEvent":{"x-event-type":"onramp.transaction.success","allOf":[{"$ref":"#/components/schemas/OnrampTransactionEvent"}]},"OnrampTransactionFailedEvent":{"x-event-type":"onramp.transaction.failed","allOf":[{"$ref":"#/components/schemas/OnrampTransactionEvent"}]},"OfframpTransactionPayload":{"type":"object","description":"Webhook payload for offramp transactions. Serialized from the OfframpTransaction proto via protojson with eventType appended.","properties":{"eventType":{"type":"string","description":"The webhook event type.","example":"offramp.transaction.updated"},"transactionId":{"type":"string","description":"Unique transaction identifier.","example":"a1b2c3d4-e5f6-7890-abcd-ef1234567890"},"status":{"type":"string","description":"Current status of the offramp transaction.","enum":["TRANSACTION_STATUS_UNSPECIFIED","TRANSACTION_STATUS_CREATED","TRANSACTION_STATUS_EXPIRED","TRANSACTION_STATUS_STARTED","TRANSACTION_STATUS_SUCCESS","TRANSACTION_STATUS_FAILED"],"example":"TRANSACTION_STATUS_STARTED"},"asset":{"type":"string","description":"The crypto currency being sold (e.g., \"ETH\", \"USDC\").","example":"ETH"},"network":{"type":"string","description":"The blockchain network (e.g., \"ethereum\", \"base\").","example":"ethereum"},"sellAmount":{"$ref":"#/components/schemas/MoneyAmount"},"total":{"$ref":"#/components/schemas/MoneyAmount"},"minimumTotal":{"$ref":"#/components/schemas/MoneyAmount"},"subtotal":{"$ref":"#/components/schemas/MoneyAmount"},"coinbaseFee":{"$ref":"#/components/schemas/MoneyAmount"},"exchangeRate":{"$ref":"#/components/schemas/MoneyAmount"},"unitPrice":{"$ref":"#/components/schemas/MoneyAmount"},"fromAddress":{"type":"string","description":"The address crypto was received from.","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"},"toAddress":{"type":"string","description":"The address crypto was sent to (Coinbase deposit address).","example":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"},"createdAt":{"type":"string","format":"date-time","description":"When the transaction was created.","example":"2025-09-02T02:34:13Z"},"updatedAt":{"type":"string","format":"date-time","description":"When the transaction was last updated.","example":"2025-09-02T02:40:00Z"},"txHash":{"type":"string","description":"The onchain transaction hash of the crypto send.","example":"0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890"},"redirectUrl":{"type":"string","description":"The URL the user was redirected to after confirming the offramp.","example":"https://partner.com/offramp/complete"},"paymentMethod":{"type":"string","description":"The payment method type used for cashout.","enum":["UNSPECIFIED","CARD","ACH_BANK_ACCOUNT","APPLE_PAY","FIAT_WALLET","CRYPTO_ACCOUNT","GUEST_CHECKOUT_CARD","PAYPAL","RTP","GUEST_CHECKOUT_APPLE_PAY","GUEST_CHECKOUT_GOOGLE_PAY"],"example":"ACH_BANK_ACCOUNT"}},"required":["eventType","transactionId","status"]},"OfframpTransactionCreatedEvent":{"x-event-type":"offramp.transaction.created","allOf":[{"$ref":"#/components/schemas/OfframpTransactionPayload"}]},"OfframpTransactionUpdatedEvent":{"x-event-type":"offramp.transaction.updated","allOf":[{"$ref":"#/components/schemas/OfframpTransactionPayload"}]},"OfframpTransactionSuccessEvent":{"x-event-type":"offramp.transaction.success","allOf":[{"$ref":"#/components/schemas/OfframpTransactionPayload"}]},"OfframpTransactionFailedEvent":{"x-event-type":"offramp.transaction.failed","allOf":[{"$ref":"#/components/schemas/OfframpTransactionPayload"}]},"CustomersEventBase":{"type":"object","description":"Common envelope fields included in every Customers webhook event payload.","properties":{"eventId":{"type":"string","format":"uuid","description":"Unique identifier for this logical webhook event. Webhooks are delivered at least once, so your endpoint may receive duplicate deliveries for the same event. Use this `eventId` as the idempotency/deduplication key.","example":"3a7f8b2e-1c4d-4e9a-b5f6-d8a2c0e7f194"},"eventType":{"type":"string","description":"The type of webhook event.","example":"customers.customer.deleted"},"timestamp":{"type":"string","format":"date-time","description":"The UTC ISO 8601 timestamp at which the underlying state change occurred, not the time at which this webhook was delivered.","example":"2026-04-01T12:00:02Z"}},"required":["eventId","eventType","timestamp"]},"CustomersCapabilityChangedEvent":{"x-event-type":"customers.capability.changed","allOf":[{"$ref":"#/components/schemas/CustomersEventBase"},{"type":"object","properties":{"eventType":{"type":"string","description":"The type of webhook event.","enum":["customers.capability.changed"],"example":"customers.capability.changed"},"data":{"type":"object","description":"Payload body for the `customers.capability.changed` event. Emitted when the status of a capability changes. Several capabilities may change in a single event, with each change represented by a distinct entry in the `capabilities` array.","properties":{"customerId":{"allOf":[{"$ref":"#/components/schemas/CustomerId"}],"description":"The CDP Customer ID the event applies to.","example":"customer_38d54acb-0868-431c-a88e-1ffcb62655eb"},"capabilities":{"type":"array","description":"The set of capabilities whose status changed in this event.","minItems":1,"items":{"type":"object","description":"A single capability whose status changed. Carries only `{code, status}`.","properties":{"code":{"allOf":[{"$ref":"#/components/schemas/CapabilityName"}],"description":"The capability whose status changed.","example":"custodyFiat"},"status":{"allOf":[{"$ref":"#/components/schemas/CapabilityStatus"}],"description":"The new status of the capability after the change.","example":"active"}},"required":["code","status"],"example":{"code":"custodyFiat","status":"active"}},"example":[{"code":"custodyFiat","status":"inactive"},{"code":"custodyStablecoin","status":"inactive"},{"code":"transferFiat","status":"inactive"}]}},"required":["customerId","capabilities"],"example":{"customerId":"customer_38d54acb-0868-431c-a88e-1ffcb62655eb","capabilities":[{"code":"custodyFiat","status":"active"}]}}},"required":["eventType","data"]}]},"CustomersCustomerDeletedEvent":{"x-event-type":"customers.customer.deleted","allOf":[{"$ref":"#/components/schemas/CustomersEventBase"},{"type":"object","properties":{"eventType":{"type":"string","description":"The type of webhook event.","enum":["customers.customer.deleted"],"example":"customers.customer.deleted"},"data":{"type":"object","description":"Payload body for the `customers.customer.deleted` event. Emitted when the Customer record is deleted; this transition is terminal.","properties":{"customerId":{"allOf":[{"$ref":"#/components/schemas/CustomerId"}],"description":"The ID of the deleted Customer.","example":"customer_38d54acb-0868-431c-a88e-1ffcb62655eb"}},"required":["customerId"],"example":{"customerId":"customer_38d54acb-0868-431c-a88e-1ffcb62655eb"}}},"required":["eventType","data"]}]}},"responses":{"IdempotencyError":{"description":"Idempotency key conflict.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"idempotency_error":{"value":{"errorType":"idempotency_error","errorMessage":"Idempotency key '8e03978e-40d5-43e8-bc93-6894a57f9324' was already used with a different request payload. Please try again with a new idempotency key."}}}}}},"EndpointUnavailableError":{"description":"The endpoint cannot serve the request right now, either because the API is in an unintended outage (`service_unavailable` — dependency failure, deploy issue) or because an operator has intentionally disabled this specific endpoint via a kill switch (`endpoint_unavailable`). Clients should dispatch on `errorType`: `service_unavailable` is typically transient and safe to retry, while `endpoint_unavailable` may persist until an operator re-enables the endpoint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"service_unavailable":{"summary":"API-wide outage","value":{"errorType":"service_unavailable","errorMessage":"Service unavailable. Please try again later."}},"endpoint_unavailable":{"summary":"Endpoint disabled by operator","value":{"errorType":"endpoint_unavailable","errorMessage":"This endpoint is temporarily unavailable. Please try again later."}}}}}},"UnauthorizedError":{"description":"Unauthorized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"unauthorized":{"value":{"errorType":"unauthorized","errorMessage":"The request is not properly authenticated."}}}}}},"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."}}}}}},"RateLimitExceeded":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"rate_limit_exceeded":{"value":{"errorType":"rate_limit_exceeded","errorMessage":"Rate limit exceeded."}}}}}},"PaymentMethodRequiredError":{"description":"A payment method is required to complete this operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"payment_method_required":{"value":{"errorType":"payment_method_required","errorMessage":"A valid payment method is required to complete this operation. Please add a payment method to your account at https://portal.cdp.coinbase.com."}}}}}},"DelegationForbiddenError":{"description":"The request was rejected due to a delegation issue. The errorType field indicates the specific reason.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"forbidden":{"value":{"errorType":"forbidden","errorMessage":"Unable to complete the requested signing or sending operation for this address."}},"delegation_not_found":{"value":{"errorType":"delegation_not_found","errorMessage":"Unable to complete this operation. No active delegation grant was found. Create a delegation for this operation and try again."}},"delegation_expired":{"value":{"errorType":"delegation_expired","errorMessage":"The delegation grant has expired. Create a new delegation grant and retry the request."}},"delegation_revoked":{"value":{"errorType":"delegation_revoked","errorMessage":"The delegation grant has been revoked. Please create a new delegation."}},"delegation_not_authorized":{"value":{"errorType":"delegation_not_authorized","errorMessage":"The delegation grant does not authorize this operation."}},"delegation_not_enabled":{"value":{"errorType":"delegation_not_enabled","errorMessage":"Delegated signing is not enabled for this project."}}}}}},"AlreadyExistsError":{"description":"The resource already exists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"idempotency_key_already_exists":{"value":{"errorType":"already_exists","errorMessage":"Another request with the same idempotency key is currently processing."}}}}}},"InvalidSQLQueryError":{"description":"The underlying SQL string is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"unsupported_query":{"value":{"errorType":"invalid_sql_query","errorMessage":"INSERTs are not supported."}},"invalid_sql":{"value":{"errorType":"invalid_sql_query","errorMessage":"SQL syntax error: Invalid table name 'invalid_table'."}},"query_too_long":{"value":{"errorType":"invalid_sql_query","errorMessage":"Query exceeds maximum length of 10,000 characters."}}}}}},"ClientClosedRequestError":{"description":"The client closed the connection before the server could send a response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"client_closed_request":{"value":{"errorType":"client_closed_request","errorMessage":"The client closed the request before the server could send a response."}}}}}},"TimedOutError":{"description":"The request timed out.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"timed_out":{"value":{"errorType":"timed_out","errorMessage":"The request timed out because the server did not respond in time."}}}}}},"x402VerifyResponse":{"description":"Successfully verified payment on the x402 protocol.","content":{"application/json":{"schema":{"type":"object","properties":{"isValid":{"type":"boolean","description":"Indicates whether the payment is valid.","example":false},"invalidReason":{"$ref":"#/components/schemas/x402VerifyInvalidReason"},"invalidMessage":{"type":"string","description":"The message describing the invalid reason.","example":"Insufficient funds"},"payer":{"allOf":[{"$ref":"#/components/schemas/BlockchainAddress"}],"description":"The onchain address of the client that is paying for the resource.\n\nFor EVM networks, the payer will be a 0x-prefixed, checksum EVM address.\n\nFor Solana-based networks, the payer will be a base58-encoded Solana address.","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"},"extra":{"type":"object","description":"Optional scheme-specific verify metadata returned by the facilitator.","additionalProperties":true,"example":{}}},"required":["isValid","payer"]}}}},"x402VerifyInvalidError":{"description":"Invalid payment verification on the x402 protocol.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/x402VerifyPaymentRejection"},"examples":{"invalid_verification":{"value":{"isValid":false,"invalidReason":"insufficient_funds","invalidMessage":"Insufficient funds","payer":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"}}}}}},"x402SettleResponse":{"description":"Successfully settled payment on the x402 protocol.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","description":"Indicates whether the payment settlement is successful.","example":false},"errorReason":{"$ref":"#/components/schemas/x402SettleErrorReason"},"errorMessage":{"type":"string","description":"The message describing the error reason.","example":"Insufficient funds"},"payer":{"allOf":[{"$ref":"#/components/schemas/BlockchainAddress"}],"description":"The onchain address of the client that is paying for the resource.\n\nFor EVM networks, the payer will be a 0x-prefixed, checksum EVM address.\n\nFor Solana-based networks, the payer will be a base58-encoded Solana address.","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"},"transaction":{"type":"string","description":"The transaction of the settlement.\nFor EVM networks, the transaction will be a 0x-prefixed, EVM transaction hash.\nFor Solana-based networks, the transaction will be a base58-encoded Solana signature.","pattern":"^(0x[a-fA-F0-9]{64}|[1-9A-HJ-NP-Za-km-z]{87,88})$","example":"0x89c91c789e57059b17285e7ba1716a1f5ff4c5dace0ea5a5135f26158d0421b9"},"network":{"type":"string","description":"The network where the settlement occurred.","example":"base"},"amount":{"type":"string","description":"The amount that was settled, in atomic units.","example":"1000000"},"extra":{"type":"object","description":"Optional scheme-specific success metadata returned by the facilitator.","additionalProperties":true,"example":{"chargedAmount":"1000000","channelState":{"channelId":"0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890","balance":"9000000","totalClaimed":"1000000","withdrawRequestedAt":0,"refundNonce":"0"},"voucherState":{"signedMaxClaimable":"1000000","signature":"0xf3746613c2d920b5fdabc0856f2aeb2d4f88ee6037b8cc5d04a71a4462f134801234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1b"}}}},"required":["success","payer","transaction","network"]}}}},"x402SettleError":{"description":"Unsuccessful payment settlement on the x402 protocol.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/x402SettlePaymentRejection"},"examples":{"unsuccessful_settlement":{"value":{"success":false,"errorReason":"insufficient_funds","errorMessage":"Insufficient funds","payer":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"}}}}}},"x402SupportedPaymentKindsResponse":{"description":"Successfully retrieved supported payment kinds for the x402 protocol.","content":{"application/json":{"schema":{"type":"object","properties":{"kinds":{"type":"array","description":"The list of supported payment kinds.","items":{"$ref":"#/components/schemas/x402SupportedPaymentKind"},"example":[{"x402Version":2,"scheme":"exact","network":"eip155:8453"},{"x402Version":2,"scheme":"exact","network":"eip155:84532"},{"x402Version":2,"scheme":"exact","network":"eip155:137"},{"x402Version":2,"scheme":"exact","network":"eip155:42161"},{"x402Version":2,"scheme":"exact","network":"eip155:480"},{"x402Version":2,"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","extra":{"feePayer":"BENrLoUbndxoNMUS5JXApGMtNykLjFXXixMtpDwDR9SP"}},{"x402Version":2,"scheme":"exact","network":"solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1","extra":{"feePayer":"BENrLoUbndxoNMUS5JXApGMtNykLjFXXixMtpDwDR9SP"}},{"x402Version":2,"scheme":"upto","network":"eip155:8453","extra":{"facilitatorAddress":"0x8f5cb67b49555e614892b7233cfddebfb746e531"}},{"x402Version":2,"scheme":"upto","network":"eip155:84532","extra":{"facilitatorAddress":"0x8f5cb67b49555e614892b7233cfddebfb746e531"}},{"x402Version":2,"scheme":"upto","network":"eip155:137","extra":{"facilitatorAddress":"0x8f5cb67b49555e614892b7233cfddebfb746e531"}},{"x402Version":2,"scheme":"upto","network":"eip155:42161","extra":{"facilitatorAddress":"0x8f5cb67b49555e614892b7233cfddebfb746e531"}},{"x402Version":2,"scheme":"upto","network":"eip155:480","extra":{"facilitatorAddress":"0x8f5cb67b49555e614892b7233cfddebfb746e531"}},{"x402Version":2,"scheme":"batch-settlement","network":"eip155:8453","extra":{"receiverAuthorizer":"0x4A8f3C2e1D9b7F6a0E5c8B3d2A1f9E7c6D4b2A0f"}},{"x402Version":2,"scheme":"batch-settlement","network":"eip155:84532","extra":{"receiverAuthorizer":"0x4A8f3C2e1D9b7F6a0E5c8B3d2A1f9E7c6D4b2A0f"}},{"x402Version":2,"scheme":"batch-settlement","network":"eip155:137","extra":{"receiverAuthorizer":"0x4A8f3C2e1D9b7F6a0E5c8B3d2A1f9E7c6D4b2A0f"}},{"x402Version":2,"scheme":"batch-settlement","network":"eip155:42161","extra":{"receiverAuthorizer":"0x4A8f3C2e1D9b7F6a0E5c8B3d2A1f9E7c6D4b2A0f"}},{"x402Version":2,"scheme":"batch-settlement","network":"eip155:480","extra":{"receiverAuthorizer":"0x4A8f3C2e1D9b7F6a0E5c8B3d2A1f9E7c6D4b2A0f"}},{"x402Version":1,"scheme":"exact","network":"base"},{"x402Version":1,"scheme":"exact","network":"base-sepolia"},{"x402Version":1,"scheme":"exact","network":"solana","extra":{"feePayer":"BENrLoUbndxoNMUS5JXApGMtNykLjFXXixMtpDwDR9SP"}},{"x402Version":1,"scheme":"exact","network":"solana-devnet","extra":{"feePayer":"BENrLoUbndxoNMUS5JXApGMtNykLjFXXixMtpDwDR9SP"}}]},"extensions":{"type":"array","description":"The list of supported x402 extensions.","items":{"type":"string"},"example":["bazaar","eip2612GasSponsoring"]},"signers":{"type":"object","description":"A map of CAIP-2 network or protocol family patterns to their supported signer addresses.","additionalProperties":{"type":"array","items":{"type":"string"}},"example":{"eip155:*":["0x8f5cb67b49555e614892b7233cfddebfb746e531","0x67b9ce703d9ce658d7c4ac3c289cea112fe662af","0x68a96f41ff1e9f2e7b591a931a4ad224e7c07863","0x97acce27d5069544480bde0f04d9f47d7422a016","0xa32ccda98ba7529705a059bd2d213da8de10d101"],"solana:*":["BENrLoUbndxoNMUS5JXApGMtNykLjFXXixMtpDwDR9SP","BFK9TLC3edb13K6v4YyH3DwPb5DSUpkWvb7XnqCL9b4F","D6ZhtNQ5nT9ZnTHUbqXZsTx5MH2rPFiBBggX4hY1WePM","GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb","Hc3sdEAsCGQcpgfivywog9uwtk8gUBUZgsxdME1EJy88"]}}},"required":["kinds","extensions","signers"]}}}},"ForbiddenError":{"description":"User forbidden from performing the action.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"forbidden":{"value":{"errorType":"forbidden","errorMessage":"User forbidden from performing the action."}}}}}}},"examples":{"ListTransfersResponse":{"summary":"Page containing a regular and an FX (completed) transfer","value":{"transfers":[{"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"}},{"transferId":"transfer_bf3948c1-ab57-5gf8-cde3-ddd33e046225","status":"completed","source":{"accountId":"account_af2937b0-9846-4fe7-bfe9-ccc22d935114","asset":"usdc"},"target":{"accountId":"account_bf3948c1-ab57-5af8-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"}]}},"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-5af8-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-5af8-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"}}}},"x-tagGroups":[{"name":"Wallets","x-groups":[{"name":"Custodial","tags":["Accounts"]},{"name":"Non-custodial","x-groups":[{"name":"User Wallets","tags":["End User Account Management","End User Accounts"]},{"name":"API Key Wallets","tags":["EVM Accounts","EVM Smart Accounts","Solana Accounts"]}],"tags":["Policy Engine","Wallet Webhooks"]}],"tags":["Accounts","End User Account Management","End User Accounts","EVM Accounts","EVM Smart Accounts","Solana Accounts","Policy Engine","Wallet Webhooks"]},{"name":"Payments","tags":["Deposit Destinations","Payment Methods","Transfers","Onramp","x402 Facilitator"]},{"name":"Trading","tags":["EVM Swaps"]},{"name":"Onchain Tools","tags":["EVM Token Balances","Faucets","Onchain Data","Solana Token Balances","SQL API"]},{"name":"Webhooks","tags":["Webhooks"]},{"name":"Customers","tags":["Customers"]}]}