{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":["admonition"]},"type":"markdown"},"seo":{"title":"Palisade","siteUrl":"https://opensource.ripple.com/","meta":[{"name":"google-site-verification","content":"bLwyBi1imklcIuQxZ7JeI_kRF5Mg7yfr6arpEQV2nsE"}],"llmstxt":{"hide":false,"sections":[{"title":"Table of contents","includeFiles":["**/*"],"excludeFiles":[]}],"excludeFiles":[]},"description":"PalisadeCustody is simpleXRPL's production connector for Palisade — construction config and required fields for create()."},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"palisade","__idx":0},"children":["Palisade"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"a","attributes":{"href":"https://github.com/ripple/simpleXRPL/blob/95b977b15f8950c5bc076b25165217869c0b06d3/src/custodians/palisade/config.ts#L40"},"children":["[Source]"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Palisade is a Wallet-as-a-Service. This connector authenticates via OAuth2 client credentials and acts on specific vaults/wallets. See: ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"https://docs.ripple.com/products/wallet/getting-started/getting-started-api"},"children":["Getting started with the API"]}," for instructions on creating API credentials to fill in this constructor."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For a full table of Palisade v2 API operations and how ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["simpleXRPL"]}," uses them, see: ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"https://github.com/ripple/simpleXRPL/blob/main/docs/palisade-api-coverage.md"},"children":["Palisade API — simpleXRPL coverage"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"palisadecustodycreate","__idx":1},"children":["PalisadeCustody.create()"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Exchanges the credentials and discovers the org's wallets."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"signature","__idx":2},"children":["Signature"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"ts","header":{"controls":{"copy":{}}},"source":"PalisadeCustody.create(config: PalisadeCustodyConfig): Promise<PalisadeCustody>\n","lang":"ts"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"config","__idx":3},"children":["Config"]},{"$$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":"Field"},"children":["Field"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Type"},"children":["Type"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Required"},"children":["Required"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Description"},"children":["Description"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["baseUrl"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["string"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Yes"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Palisade API base URL (must be HTTPS)."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["credentials"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PalisadeCredentials"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Yes"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["The wallet-read and transactions API credentials. See ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"#credentials"},"children":["Credentials"]},"."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["credentials.wallets"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["object"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Yes"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Wallet-read credential — authorizes account discovery (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /v2/wallets"]},"). A ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["{ clientId, clientSecret }"]}," pair."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["credentials.transactions"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["object"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Yes"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Transactions credential — authorizes signing and submission. A ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["{ clientId, clientSecret }"]}," pair."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["credentials.scoped"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["object"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["No"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Per-scope credentials for the ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"#palisadeapicall"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["palisade.api"]}]}," surface, keyed by Palisade permission scope (e.g. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Policies"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Webhooks"]},"). See ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"#credentials"},"children":["Credentials"]},"."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["primary"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PalisadeWalletRef"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Yes"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["The wallet used when an operation is called without an explicit account."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["primary.vaultId"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["string"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Yes"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["The primary wallet's vault id."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["primary.walletId"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["string"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Yes"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["The primary wallet's id."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["allowRawSigning"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["boolean"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["No"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Allow the raw fallback for transactors/fields Palisade can't map natively. Defaults to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["false"]},"."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["defaultTimeoutMs"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["number"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["No"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["How long to wait for a native submission to reach a terminal status."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["http"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["object"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["No"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["A custom HTTP transport (implements ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PalisadeHttpPort"]},"). Defaults to the production fetch port; most callers omit it."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["now"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["() => number"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["No"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Injectable clock for the auth service, returning epoch ms, e.g. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["() => Date.now()"]},". Defaults to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Date.now"]},"."]}]}]}]}]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"warning","name":"Caution"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Enabling ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["allowRawSigning"]}," weakens the custodian's controls. On the raw path the custodian signs an opaque payload rather than a structured operation, so its transaction-level controls (transfer policies, allow-lists, and approval rules keyed to operation semantics) cannot inspect what is being signed. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["xrpl.js"]}," protocol validation still runs on every path, so malformed transactions are still rejected; what is lost is the custodian's ability to reason about the transaction's intent."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Leave it off unless a specific transactor requires it, and prefer routing those operations through a signer that models them natively."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"credentials","__idx":4},"children":["Credentials"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Palisade scopes one permission set per credential, so the connector requires ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["two"]},": a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["wallets"]}," credential for discovery and a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["transactions"]}," credential for signing and submission. Requests route between them by HTTP method — reads (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET"]},") go on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["wallets"]},", mutations on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["transactions"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["credentials.scoped"]}," adds optional tag-based routing for the ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"#palisadeapicall"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["palisade.api"]}]}," escape hatch. Each key is a Palisade permission scope (an operation's OpenAPI tag); every operation in that scope routes to its credential instead of falling back to the method-based pair. Administering policies or webhooks needs this, because those permission sets live on their own credential."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"ts","header":{"controls":{"copy":{}}},"source":"credentials: {\n  wallets: { clientId: '…', clientSecret: '…' },\n  transactions: { clientId: '…', clientSecret: '…' },\n  scoped: {\n    Policies: { clientId: '…', clientSecret: '…' },\n  },\n}\n","lang":"ts"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"palisadeapicall","__idx":5},"children":["palisade.api.call()"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Call any Palisade v2 operation directly, using the escape hatch for operations the ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/docs/simplexrpl/references/verticals"},"children":["verticals"]}," don't model first-class (vaults, counterparties, policies, webhooks, balances). Path params, query, body, and the response are all typed from the generated OpenAPI schema."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"signature-1","__idx":6},"children":["Signature"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"ts","header":{"controls":{"copy":{}}},"source":"palisade.api.call(operationId: PalisadeOperationId, args?: PalisadeCallArgs): Promise<Response>\n","lang":"ts"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"parameters","__idx":7},"children":["Parameters"]},{"$$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":"Parameter"},"children":["Parameter"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Type"},"children":["Type"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Required"},"children":["Required"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Description"},"children":["Description"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["operationId"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PalisadeOperationId"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Yes"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["The Palisade operationId, e.g. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["VaultService_ListGlobalWallets"]},". Autocompletes to every generated route."]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"args","__idx":8},"children":["Args"]},{"$$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":"Field"},"children":["Field"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Type"},"children":["Type"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Required"},"children":["Required"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Description"},"children":["Description"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["path"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["object"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["No"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Path parameters, keyed by placeholder name. Required when the route template has placeholders; a missing one throws before any request is sent."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["query"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["object"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["No"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Query-string parameters."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["body"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["object"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["No"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["JSON request body, type-checked against the operation's request schema."]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Throws ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SimpleXRPLError"]}," if a required path parameter is missing, and ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/docs/simplexrpl/references/errors"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PalisadeApiError"]}]}," if the API rejects the request."]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info","name":"Note"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["palisade.api"]}," is a ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["secondary"]}," surface; prefer a ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/docs/simplexrpl/references/verticals"},"children":["vertical operation"]}," when one exists. For a tutorial on how to use ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["palisade.api"]},", see: ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/docs/simplexrpl/tutorials/call-palisade-operations-directly"},"children":["Call Palisade Operations Directly"]},"."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"example","__idx":9},"children":["Example"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"ts","header":{"controls":{"copy":{}}},"source":"const palisade = await PalisadeCustody.create({\n  baseUrl: 'https://api.sandbox.palisade.co',\n  credentials: {\n    wallets: {\n      clientId: process.env.PALISADE_WALLETS_CLIENT_ID ?? '',\n      clientSecret: process.env.PALISADE_WALLETS_CLIENT_SECRET ?? '',\n    },\n    transactions: {\n      clientId: process.env.PALISADE_TX_CLIENT_ID ?? '',\n      clientSecret: process.env.PALISADE_TX_CLIENT_SECRET ?? '',\n    },\n  },\n  primary: {\n    vaultId: process.env.PALISADE_VAULT_ID ?? '',\n    walletId: process.env.PALISADE_WALLET_ID ?? '',\n  },\n})\n","lang":"ts"},"children":[]}]},"headings":[{"value":"Palisade","id":"palisade","depth":1},{"value":"PalisadeCustody.create()","id":"palisadecustodycreate","depth":2},{"value":"Signature","id":"signature","depth":3},{"value":"Config","id":"config","depth":3},{"value":"Credentials","id":"credentials","depth":3},{"value":"palisade.api.call()","id":"palisadeapicall","depth":2},{"value":"Signature","id":"signature-1","depth":3},{"value":"Parameters","id":"parameters","depth":3},{"value":"Args","id":"args","depth":3},{"value":"Example","id":"example","depth":2}],"frontmatter":{"seo":{"description":"PalisadeCustody is simpleXRPL's production connector for Palisade — construction config and required fields for create().","title":"Palisade"},"labels":["simpleXRPL","SDK"]},"editPage":{"to":"https://github.com/ripple/opensource.ripple.com/tree/main/docs/simpleXRPL/references/connectors/palisade.md"},"lastModified":"2026-08-26T19:04:06.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/docs/simplexrpl/references/connectors/palisade","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}