---
title: "Create Stealth Pool"
method: POST
path: "/v1/spl/stealth-pool"
---

# Create Stealth Pool

`POST /v1/spl/stealth-pool`

Build unsigned stealth-pool setup and ER update transactions that map a handle to 1-10 destination owner keys. Requires an `Authorization: Bearer <token>` header from the `/v1/spl/login` flow. Once initialized, the handle can be used as the `to` value of a private `/v1/spl/transfer`.

## Request body

- object
  - `payer` string, required
  - `authority` string, required — Authority allowed to manage the pool.
  - `handle` string, required — Human-readable handle, up to 255 UTF-8 bytes. Stored as its exact bytes — NOT trimmed, lowercased, or normalized, so `John.Doe@…` is a different handle than `john.doe@…`.
  - `destinations` string[], required — 1-10 destination owner pubkeys (owners, not token accounts).
  - `splitAcrossKeys` boolean — Optional. When `true`, split payments may resolve independently across the destination keys.
  - `validator` string — Optional. Validator identity to receive the delegated pool.
  - `cluster` union — Optional. Cluster selector or custom http(s) RPC URL.
    - 'mainnet' | 'devnet' | 'mainnet-private' | 'devnet-private'
    - string, uri

## Response `200`

Unsigned setup and ER update transactions

- object
  - `kind` 'stealthPool', required
  - `version` 'legacy' | 'v0', required
  - `transactionBase64` string, required — The ER update transaction.
  - `sendTo` 'base' | 'ephemeral', required
  - `sendRpcEndpoint` string, uri
  - `recentBlockhash` string, required
  - `lastValidBlockHeight` integer, required
  - `instructionCount` integer, required
  - `requiredSigners` string[], required
  - `stealthPool` string, required — Derived stealth-pool PDA.
  - `setupTransaction` object, required — The base-chain setup transaction. It uses the same transaction response contract as the top-level transaction; `sendRpcEndpoint` is omitted when `sendTo` is `base`.
    - `kind` 'stealthPool', required
    - `version` 'legacy' | 'v0', required
    - `transactionBase64` string, required
    - `sendTo` 'base' | 'ephemeral', required
    - `sendRpcEndpoint` string, uri — Exact ephemeral RPC endpoint where the signed transaction should be submitted. Present when `sendTo` is `ephemeral`.
    - `from` 'base' | 'ephemeral'
    - `recentBlockhash` string, required
    - `lastValidBlockHeight` integer, required
    - `instructionCount` integer, required
    - `requiredSigners` string[], required
    - `validator` string
    - `fees` object
      - `lamports` string, required
      - `tokens` string, required

## Other responses

- `400` — Build error
- `422` — Validation error

---

[API](https://skmtc.dev/magicblock/apis/magicblock-router-api.md) · [All operations](https://skmtc.dev/magicblock/apis/magicblock-router-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/magicblock/magicblock-router-api/revisions/f024efa907c6/schema)
