Stealth endpoints
Create payment payload
POST /api/v1/stealth/create derives stealth destination and announcement data.
Scan announcements
POST /api/v1/stealth/scan discovers payments addressed to your keys.
Workflow
Create stealth payload
Send recipient meta_address to /api/v1/stealth/create.
Publish announcement
Store the returned payment_id with /api/v1/registry/announcements.
Scan with recipient keys
Use /api/v1/stealth/scan and recipient key material to recover discoveries.
POST /api/v1/stealth/create
Request schema
Hex-encoded recipient meta-address.
Response schema
Server-held pending-payment identifier required by the preferred publish path.
Checksummed stealth EVM address.
Stealth Sui address derived from the same key material.
Hex-encoded ephemeral ciphertext.
1-byte view tag for fast filtering. This value is bound to payment_id server-side.
Announcement object returned for client-side reference and fallback publish.
Announcement ID value from in-memory construction.
Hex ephemeral ciphertext.
Announcement view tag.
Unix timestamp set at creation.
Optional EIP-155 source-chain ID.
Optional Monad announce transaction hash.
Optional source-chain payment transaction hash.
Optional amount string.
Optional chain identifier.
Optional recipient stealth address.
POST /api/v1/stealth/scan
Request schema
Viewing secret key in hex.
Spending public key in hex (33-byte compressed secp256k1). The scan endpoint never
accepts the spending secret key — it returns each match's shared_secret so the client
derives spend keys locally.
Optional list of specific view tags to pre-filter announcements.
Optional scan window start (Unix timestamp).
Optional scan window end (Unix timestamp).
Response schema
Array of discovered payments.
Discovered EVM stealth address.
Discovered Sui stealth address.
Hex ML-KEM shared secret for this match. The client uses it with the spending secret key locally to derive the one-time stealth private key — the server never sees the spend key.
Registry ID of the matched announcement.
Announcement timestamp (Unix seconds).
Optional Monad announce transaction hash.
Source-chain payment transaction hash decrypted from metadata.
Optional amount (hex uint256; empty when unavailable).
Optional chain identifier.
EIP-155 source-chain ID decrypted from metadata.
Scan execution metrics.
Number of announcements scanned.
Number of announcements that passed the view-tag filter after decapsulation.
Number of discovered payments.
Total scan duration in milliseconds.
Scan throughput (announcements per second).
Example calls
- Create (cURL)
- Scan (cURL)
- JavaScript
curl -s -X POST https://backend.specterpq.com/api/v1/stealth/create \
-H "Content-Type: application/json" \
-d '{"meta_address":"<HEX_META_ADDRESS>"}' | jq .
curl -s -X POST https://backend.specterpq.com/api/v1/stealth/scan \
-H "Content-Type: application/json" \
-d '{
"viewing_sk":"<HEX_VIEWING_SK>",
"spending_pub":"<HEX_SPENDING_PUB>",
"view_tags":[42]
}' | jq .
const createRes = await fetch("https://backend.specterpq.com/api/v1/stealth/create", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ meta_address })
});
const createData = await createRes.json();
console.log(createData.payment_id, createData.stealth_address, createData.view_tag);
Filter precedence in scan handler
Scan selection uses this order: view_tags filter first, else time range when both from_timestamp and to_timestamp are provided, else full registry scan.
Hex prefix handling
Scan key fields accept values with or without a 0x prefix (strip_hex_prefix in handler).
No private keys in discoveries
Discovery output contains shared_secret, not private keys. The scan is spend-key-free: the
client combines shared_secret with the spending secret key locally to derive the one-time
stealth private key. The server never receives or returns spend keys.
viewing_sk and every shared_secret in the response are sensitive — a shared secret plus the
spending secret key recovers a spendable key. Treat them as production secrets.