{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-products/wallet/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":["admonition"]},"type":"markdown"},"seo":{"title":"Getting started with the API","description":"User guides, API reference, and support resources.","siteUrl":"https://docs.ripple.com/products/custody","lang":"en-US","llmstxt":{"hide":false,"sections":[{"title":"Table of contents","includeFiles":["**/*"],"excludeFiles":[]}],"excludeFiles":[]}},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"getting-started-with-the-api","__idx":0},"children":["Getting started with the API"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This guide walks you through the Wallet-as-a-Service (Palisade) API from authentication to your first confirmed transaction. Every step includes a complete ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["curl"]}," command you can run against the sandbox environment."]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info","name":"Console alternative"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Prefer a visual interface? Follow the ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/products/wallet/getting-started/getting-started"},"children":["console getting-started guide"]}," instead."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"prerequisites","__idx":1},"children":["Prerequisites"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Sign in to the Wallet-as-a-Service (Palisade) console at ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["https://app.sandbox.palisade.co"]},". See ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/products/wallet/introduction/set-up-your-organization"},"children":["Creating your organisation"]}," if this is your first login."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If you plan to use MPC wallets, set up at least one quorum first. See ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/products/wallet/getting-started/configure-devices-and-quorums"},"children":["Configure devices and quorums"]},". For sandbox testing, skip this and use HSM wallets instead."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"base-url","__idx":2},"children":["Base URL"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["All examples in this guide use the sandbox environment:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"https://api.sandbox.palisade.co\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For production, replace with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["https://api.palisade.co"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-1-create-api-credentials","__idx":3},"children":["Step 1: Create API credentials"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Generate API credentials in the console to authenticate your API requests."]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Navigate to ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Settings"]}," > ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["API credentials"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Click ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Create credentials"]},". This opens the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Permissions set"]}," page."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Under ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Permission set type"]},", select ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Wallets"]},". Each type provides a different set of permissions:"]}]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Permission set type"},"children":["Permission set type"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"What it grants"},"children":["What it grants"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Wallets"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Manage wallets and vaults"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Transactions"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Manage transactions"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Controls"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Manage policies and addresses"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Monitoring"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Webhooks and auditing"]}]}]}]}]},{"$$mdtype":"Tag","name":"ol","attributes":{"start":4},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Under ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Name and description"]},", enter a ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Name"]}," (for example, \"Sandbox API - Wallets\"). The ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Description"]}," is optional."]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Under ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["IP addresses"]},", select ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["All IP addresses"]}," for sandbox testing. In production, use ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Limited IP addresses"]}," and enter a comma-separated list of IPs or CIDRs."]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Review the default permissions. Each permission is built from four components:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Type"]}," — the resource category (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["balances"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["key"]},", or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["vault"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Action"]}," — the operation (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["create"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["delete"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["read"]},", or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["update"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Scope"]}," — how broadly the permission applies (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["org"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["vault"]},", or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["key"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Resource"]}," — a specific vault or wallet (optional — leave blank to apply to all resources in the scope)"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The permission set type pre-populates sensible defaults. Click ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Add another permission"]}," to add more, or ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Remove"]}," to delete one. Since this is your first credential and you haven't created vaults or wallets yet, keep the scope set to ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["org"]}," so the credential works for all resources you create later."]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Click ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Generate credentials"]},"."]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Copy the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["clientId"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["clientSecret"]},"."]}]}]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"warning","name":"Store credentials securely"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["clientSecret"]}," is shown only once. Store it in a secrets manager or environment variable — never commit it to source control."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Repeat steps 2–8 to create credentials for ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Transactions"]}," and ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Controls"]}," — you need all three permission set types to complete this walkthrough. You can also create a single credential and add permissions from multiple types using ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Add another permission"]},"."]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info","name":"Scoping credentials in production"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Once you have vaults and wallets, you can create narrower credentials scoped to specific resources. For example, a credential with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["vault"]}," scope and a specific vault selected under ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Resource"]}," only has access to that vault. See ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/products/wallet/user-interface/api/api-credentials-best-practices"},"children":["API credentials best practices"]},"."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-2-authenticate","__idx":4},"children":["Step 2: Authenticate"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Exchange your API credentials for a Bearer token."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"curl -X POST https://api.sandbox.palisade.co/v2/credentials/oauth/token \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"clientId\": \"YOUR_CLIENT_ID\",\n    \"clientSecret\": \"YOUR_CLIENT_SECRET\"\n  }'\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Response:"]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"accessToken\": \"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...\",\n  \"scope\": \"balances:read:org:id=...  vault:create:org:id=...  key:read:org:id=...\",\n  \"expiresIn\": 3600,\n  \"tokenType\": \"Bearer\"\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["scope"]}," field lists each granted permission in the format ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["type:action:scope:id=orgId:*"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Authenticate each credential and export the tokens. The examples in this guide use ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["$TOKEN"]}," for the Wallets credential, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["$CONTROLS_TOKEN"]}," for Controls, and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["$TX_TOKEN"]}," for Transactions:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"export TOKEN=\"<Wallets accessToken>\"\nexport CONTROLS_TOKEN=\"<Controls accessToken>\"\nexport TX_TOKEN=\"<Transactions accessToken>\"\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info","name":"Token expiry"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Tokens expire after 1 hour (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["expiresIn: 3600"]},"). Request a new token before the current one expires."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-3-create-a-vault","__idx":5},"children":["Step 3: Create a vault"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A vault groups related wallets together. Create one to hold your first wallet."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"curl -X POST https://api.sandbox.palisade.co/v2/vaults \\\n  -H \"Authorization: Bearer $TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"name\": \"Sandbox Testing\",\n    \"description\": \"Vault for API getting-started walkthrough\"\n  }'\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Response:"]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"id\": \"019c8a2f-1234-7abc-9def-abcdef123456\",\n  \"organizationId\": \"21c81319-5b83-45f9-b648-42055084af15\",\n  \"createdBy\": \"a55df9e0-e14a-4410-a983-12afae46662f\",\n  \"createdAt\": \"2025-05-08T10:00:00.000Z\",\n  \"updatedAt\": \"2025-05-08T10:00:00.000Z\",\n  \"name\": \"Sandbox Testing\",\n  \"description\": \"Vault for API getting-started walkthrough\"\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Save the vault ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["id"]}," — you need it for the next step."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"export VAULT_ID=\"019c8a2f-1234-7abc-9def-abcdef123456\"\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-4-create-a-wallet","__idx":6},"children":["Step 4: Create a wallet"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Create an Ethereum wallet inside your vault. This example uses HSM (available in sandbox only) so you do not need a quorum."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"curl -X POST https://api.sandbox.palisade.co/v2/vaults/$VAULT_ID/wallets \\\n  -H \"Authorization: Bearer $TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"name\": \"ETH Sandbox Wallet\",\n    \"description\": \"Ethereum wallet for API testing\",\n    \"blockchain\": \"ETHEREUM\",\n    \"keystore\": \"HSM\"\n  }'\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The initial response has ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["status: \"CREATED\""]}," with an empty ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["address"]},". HSM wallets are provisioned within seconds. Poll the wallet until ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["status"]}," changes to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PROVISIONED"]},":"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"curl -X GET \"https://api.sandbox.palisade.co/v2/vaults/$VAULT_ID/wallets/$WALLET_ID\" \\\n  -H \"Authorization: Bearer $TOKEN\"\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Response (provisioned):"]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"id\": \"019c8a3b-5678-7def-1234-567890abcdef\",\n  \"vaultId\": \"019c8a2f-1234-7abc-9def-abcdef123456\",\n  \"organizationId\": \"...\",\n  \"name\": \"ETH Sandbox Wallet\",\n  \"description\": \"Ethereum wallet for API testing\",\n  \"address\": \"0x8dCd82eC41C41627D987830128198aff4A392D89\",\n  \"publicKey\": \"04b05c60b4ac57b85c8d69a98409c5c5b4590d77...\",\n  \"keystore\": \"HSM\",\n  \"blockchain\": \"ETHEREUM\",\n  \"settings\": {\n    \"enabled\": false,\n    \"rawSigningEnabled\": false,\n    \"sweepingEnabled\": false,\n    \"defaultFreezeEnabled\": false\n  },\n  \"status\": \"PROVISIONED\",\n  \"keyAlgorithm\": \"SECP256K1\"\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Note that ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["settings.enabled"]}," is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["false"]}," — the wallet is deposit-only until you explicitly enable outgoing transactions in a later step."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Save the wallet ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["id"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["address"]},":"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"export WALLET_ID=\"019c8a3b-5678-7def-1234-567890abcdef\"\nexport WALLET_ADDRESS=\"0x8dCd82eC41C41627D987830128198aff4A392D89\"\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info","name":"MPC wallets in production"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For production wallets, set ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"keystore\": \"MPC\""]}," and include ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"quorumId\": \"YOUR_QUORUM_ID\""]},". MPC wallets require quorum device approval before moving to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PROVISIONED"]},"."]}]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info","name":"Supported blockchains"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Replace ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ETHEREUM"]}," with any supported blockchain. See ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/products/wallet/user-interface/wallets/supported-blockchains"},"children":["Supported blockchains"]}," for the full list."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-5-fund-your-wallet","__idx":7},"children":["Step 5: Fund your wallet"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Your wallet starts with a zero balance. Send testnet funds to the wallet ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["address"]}," from a faucet or another wallet before proceeding."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For Ethereum testnet faucets, search for \"Sepolia faucet\" and send testnet ETH to your wallet address."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Verify the balance:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"curl -X GET \"https://api.sandbox.palisade.co/v2/vaults/$VAULT_ID/wallets/$WALLET_ID/balances\" \\\n  -H \"Authorization: Bearer $TOKEN\"\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Response:"]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"currencyCode\": \"USD\",\n  \"aggregatedFiatValue\": \"0\",\n  \"balances\": [\n    {\n      \"asset\": {\n        \"symbol\": \"ETH\",\n        \"name\": \"Ethereum\",\n        \"blockchain\": \"ETHEREUM\",\n        \"standard\": \"NATIVE\",\n        \"decimals\": 18\n      },\n      \"balance\": \"0\",\n      \"availableBalance\": \"0\",\n      \"pendingBalance\": \"0\",\n      \"frozenBalance\": \"0\"\n    }\n  ]\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Wait until ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["balance"]}," shows a non-zero amount before continuing."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-6-create-a-transaction-policy","__idx":8},"children":["Step 6: Create a transaction policy"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Wallets are deposit-only by default. Create a policy rule to permit outgoing transactions. This step requires a ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Controls"]}," credential."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This example creates a per-transaction limit of 10 ETH:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"curl -X PUT \"https://api.sandbox.palisade.co/v2/vaults/$VAULT_ID/wallets/$WALLET_ID/policy-rules/limits\" \\\n  -H \"Authorization: Bearer $CONTROLS_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"limitQty\": \"10\",\n    \"limitType\": \"PER_TX\",\n    \"symbol\": \"ETH\"\n  }'\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Response:"]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"id\": \"c2655be7-795e-47d3-b4e9-2fc38b26febf\",\n  \"organizationId\": \"...\",\n  \"walletId\": \"019c8a3b-5678-7def-1234-567890abcdef\",\n  \"vaultId\": \"019c8a2f-1234-7abc-9def-abcdef123456\",\n  \"limitQty\": \"10\",\n  \"limitType\": \"PER_TX\",\n  \"asset\": {\n    \"symbol\": \"ETH\",\n    \"name\": \"Ethereum\",\n    \"blockchain\": \"ETHEREUM\"\n  },\n  \"status\": \"LIMIT_CREATION_APPROVAL_PENDING\",\n  \"active\": false,\n  \"matchers\": []\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info","name":"Approval workflow"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If your organisation has approval groups configured, the policy starts with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["status: \"LIMIT_CREATION_APPROVAL_PENDING\""]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["active: false"]}," until an approver approves it in the console. If no approval groups are configured, the policy auto-transitions to active."]}]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info","name":"Policy types"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PER_TX"]}," limits a single transaction. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ROLLING_DURATION"]}," limits the total over a time window (set ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"duration\": \"86400s\""]}," for 24 hours). ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CONSTANT"]}," sets a lifetime cap."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-7-add-a-destination-address","__idx":9},"children":["Step 7: Add a destination address"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Register an external destination in the address book before you can send to it. This step requires a ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Controls"]}," credential."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"create-a-counterparty","__idx":10},"children":["Create a counterparty"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["details"]}," field requires a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["type"]}," (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["INDIVIDUAL"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ORGANIZATION"]},", or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["DAPP"]},") and the corresponding detail object:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"curl -X POST https://api.sandbox.palisade.co/v2/counterparties \\\n  -H \"Authorization: Bearer $CONTROLS_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"name\": \"Test Recipient\",\n    \"description\": \"Sandbox test counterparty\",\n    \"details\": {\n      \"type\": \"INDIVIDUAL\",\n      \"individual\": {\n        \"firstName\": \"Test\",\n        \"lastName\": \"Recipient\"\n      }\n    }\n  }'\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Response:"]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"id\": \"019d0623-86d1-7aef-9134-50e8d9cb3ee5\",\n  \"organizationId\": \"...\",\n  \"name\": \"Test Recipient\",\n  \"description\": \"Sandbox test counterparty\",\n  \"details\": {\n    \"type\": \"INDIVIDUAL\",\n    \"individual\": {\n      \"firstName\": \"Test\",\n      \"lastName\": \"Recipient\"\n    }\n  },\n  \"addressCount\": 0\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Save the counterparty ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["id"]},":"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"export COUNTERPARTY_ID=\"019d0623-86d1-7aef-9134-50e8d9cb3ee5\"\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info","name":"Counterparty types"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Use ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ORGANIZATION"]}," with a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["legalName"]}," field for businesses, or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["DAPP"]}," for decentralized applications."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"add-a-blockchain-address","__idx":11},"children":["Add a blockchain address"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"curl -X POST \"https://api.sandbox.palisade.co/v2/counterparties/$COUNTERPARTY_ID/addresses\" \\\n  -H \"Authorization: Bearer $CONTROLS_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"termsAndConditionsAccepted\": true,\n    \"details\": {\n      \"type\": \"EXTERNAL\",\n      \"externalAddress\": {\n        \"address\": \"0xDESTINATION_ADDRESS\",\n        \"name\": \"Recipient ETH Wallet\",\n        \"blockchains\": [\"ETHEREUM\"]\n      }\n    }\n  }'\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Replace ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["0xDESTINATION_ADDRESS"]}," with a valid Ethereum address. The API validates the address checksum against the selected blockchain."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Response:"]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"addressId\": \"019d0624-b5d7-77cf-8eee-b72ceac0f71e\",\n  \"counterpartyId\": \"019d0623-86d1-7aef-9134-50e8d9cb3ee5\",\n  \"organizationId\": \"...\",\n  \"termsAndConditionsAccepted\": true,\n  \"details\": {\n    \"type\": \"EXTERNAL\",\n    \"externalAddress\": {\n      \"address\": \"0xDESTINATION_ADDRESS\",\n      \"name\": \"Recipient ETH Wallet\",\n      \"blockchains\": [\"ETHEREUM\"]\n    }\n  },\n  \"status\": \"CREATION_APPROVAL_PENDING\",\n  \"active\": false\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info","name":"Approval workflow"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If your organisation has approval groups configured, the address starts with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["status: \"CREATION_APPROVAL_PENDING\""]}," until an approver approves it. If no approval groups are configured, the address auto-transitions to active."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-8-enable-outgoing-transactions","__idx":12},"children":["Step 8: Enable outgoing transactions"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Enable outgoing transactions on the wallet. This step requires a ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Wallets"]}," credential."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"curl -X PUT \"https://api.sandbox.palisade.co/v2/vaults/$VAULT_ID/wallets/$WALLET_ID/settings\" \\\n  -H \"Authorization: Bearer $TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"settings\": {\n      \"enabled\": true\n    }\n  }'\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The response is the full wallet object with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["settings.enabled"]}," now set to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["true"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-9-send-a-transaction","__idx":13},"children":["Step 9: Send a transaction"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Send 0.01 ETH to the approved destination address. This step requires a ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Transactions"]}," credential."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"curl -X POST \"https://api.sandbox.palisade.co/v2/vaults/$VAULT_ID/wallets/$WALLET_ID/transactions/transfer\" \\\n  -H \"Authorization: Bearer $TX_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"destinationAddress\": \"0xDESTINATION_ADDRESS\",\n    \"symbol\": \"ETH\",\n    \"qty\": \"0.01\"\n  }'\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Replace ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["0xDESTINATION_ADDRESS"]}," with the address you registered in Step 7."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Response:"]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"id\": \"019c94f1-cc8c-79b4-9c0f-bc7edaabc267\",\n  \"walletId\": \"...\",\n  \"vaultId\": \"...\",\n  \"status\": \"REQUESTED\",\n  \"action\": \"PALISADE_TRANSFER\",\n  \"asset\": {\n    \"symbol\": \"ETH\"\n  },\n  \"blockchain\": \"ETHEREUM\",\n  \"destinationAddress\": \"0xDESTINATION_ADDRESS\",\n  \"originAddress\": \"0x8dCd82eC41C41627D987830128198aff4A392D89\",\n  \"qty\": \"0.01\"\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Save the transaction ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["id"]},":"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"export TX_ID=\"019c94f1-cc8c-79b4-9c0f-bc7edaabc267\"\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-10-track-the-transaction","__idx":14},"children":["Step 10: Track the transaction"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Poll the transaction until it reaches a terminal status (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CONFIRMED"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["REJECTED"]},", or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["FAILED"]},"). Use a ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Transactions"]}," credential:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"curl -X GET \"https://api.sandbox.palisade.co/v2/vaults/$VAULT_ID/wallets/$WALLET_ID/transactions/$TX_ID\" \\\n  -H \"Authorization: Bearer $TX_TOKEN\"\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["status"]}," field progresses through the lifecycle until it reaches ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CONFIRMED"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The transaction moves through these statuses:"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["REQUESTED"]}," → ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POLICY_CHECK_PENDING"]}," → ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POLICY_CHECK_PASSED"]}," → ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["APPROVAL_CHECK_PENDING"]}," → ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["APPROVAL_CHECK_PASSED"]}," → ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SIGNATURE_PENDING"]}," → ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SIGNED"]}," → ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PUBLISH_PENDING"]}," → ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PUBLISHED"]}," → ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CONFIRMATION_PENDING"]}," → ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CONFIRMED"]}]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info","name":"Use webhooks instead of polling"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For production integrations, set up ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/products/wallet/user-interface/integrations/manage-webhooks"},"children":["webhooks"]}," to receive real-time status updates instead of polling."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"next-steps","__idx":15},"children":["Next steps"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"a","attributes":{"href":"/products/wallet/user-interface/integrations/manage-webhooks"},"children":["Manage webhooks"]}," for real-time transaction notifications"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"a","attributes":{"href":"/products/wallet/user-interface/api/api-credentials-best-practices"},"children":["API credentials best practices"]}," for production security"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"a","attributes":{"href":"/products/wallet/api-docs/palisade-api/palisade-api"},"children":["Wallet-as-a-Service (Palisade) API reference"]}," for the complete endpoint documentation"]}]}]},"headings":[{"value":"Getting started with the API","id":"getting-started-with-the-api","depth":1},{"value":"Prerequisites","id":"prerequisites","depth":2},{"value":"Base URL","id":"base-url","depth":2},{"value":"Step 1: Create API credentials","id":"step-1-create-api-credentials","depth":2},{"value":"Step 2: Authenticate","id":"step-2-authenticate","depth":2},{"value":"Step 3: Create a vault","id":"step-3-create-a-vault","depth":2},{"value":"Step 4: Create a wallet","id":"step-4-create-a-wallet","depth":2},{"value":"Step 5: Fund your wallet","id":"step-5-fund-your-wallet","depth":2},{"value":"Step 6: Create a transaction policy","id":"step-6-create-a-transaction-policy","depth":2},{"value":"Step 7: Add a destination address","id":"step-7-add-a-destination-address","depth":2},{"value":"Create a counterparty","id":"create-a-counterparty","depth":3},{"value":"Add a blockchain address","id":"add-a-blockchain-address","depth":3},{"value":"Step 8: Enable outgoing transactions","id":"step-8-enable-outgoing-transactions","depth":2},{"value":"Step 9: Send a transaction","id":"step-9-send-a-transaction","depth":2},{"value":"Step 10: Track the transaction","id":"step-10-track-the-transaction","depth":2},{"value":"Next steps","id":"next-steps","depth":2}],"frontmatter":{"title":"Getting started with the API","seo":{"title":"Getting started with the API"}},"lastModified":"2026-03-19T14:23:44.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/products/wallet/getting-started/getting-started-api","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}