Try it in 2 minutes
No setup required. Hit the live API and see stealth addresses in action.
Open the app Full UI experience in your browser.
API quickstart Step-by-step with copy-paste commands.
Yellow channels Try private channel creation.
Interactive API playground
Base URL: https://backend.specterpq.com
Run these in order. Each step feeds into the next.
Step 1: Generate keys
Step 2: Create stealth payment
Step 3: Publish announcement
Step 4: Scan and discover
Generate a fresh ML-KEM-768 keypair. This gives you everything needed to receive private payments. curl -s -X POST https://backend.specterpq.com/api/v1/keys/generate \
| tee /tmp/specter-keys.json | jq '{meta_address: .meta_address[0:40], spending_pk: .spending_pk[0:40], viewing_pk: .viewing_pk[0:40]}' && echo "... (truncated, full keys saved to /tmp/specter-keys.json)"
Save the variables for the next steps: META_ADDRESS = $( jq -r '.meta_address' /tmp/specter-keys.json )
VIEWING_SK = $( jq -r '.viewing_sk' /tmp/specter-keys.json )
SPENDING_PK = $( jq -r '.spending_pk' /tmp/specter-keys.json )
SPENDING_SK = $( jq -r '.spending_sk' /tmp/specter-keys.json )
Derive a one-time stealth address from the meta-address. This is what the sender does. curl -s -X POST https://backend.specterpq.com/api/v1/stealth/create \
-H "Content-Type: application/json" \
-d "{ \" meta_address \" : \" $META_ADDRESS \" }" \
| tee /tmp/specter-create.json | jq .
Note the stealth_address in the response. That’s where you’d send funds. EPHEMERAL_KEY = $( jq -r '.ephemeral_ciphertext' /tmp/specter-create.json )
VIEW_TAG = $( jq -r '.view_tag' /tmp/specter-create.json )
STEALTH_ADDRESS = $( jq -r '.stealth_address' /tmp/specter-create.json )
echo "Payment destination: $STEALTH_ADDRESS "
Post the announcement so the recipient can find the payment later. curl -s -X POST https://backend.specterpq.com/api/v1/registry/announcements \
-H "Content-Type: application/json" \
-d "{
\" ephemeral_key \" : \" $EPHEMERAL_KEY \" ,
\" view_tag \" : $VIEW_TAG ,
\" tx_hash \" : \" 0x1111111111111111111111111111111111111111111111111111111111111111 \" ,
\" amount \" : \" 0.01 \" ,
\" chain \" : \" ethereum \"
}" | jq .
Now scan with the recipient’s keys to find the payment. curl -s -X POST https://backend.specterpq.com/api/v1/stealth/scan \
-H "Content-Type: application/json" \
-d "{
\" viewing_sk \" : \" $VIEWING_SK \" ,
\" spending_pk \" : \" $SPENDING_PK \" ,
\" spending_sk \" : \" $SPENDING_SK \"
}" | jq .
You should see one discovery with the same stealth_address from step 2. The scan response contains eth_private_key. This is real wallet secret material. Don’t expose it in logs or analytics.
Yellow channel playground
Test the private channel flow:
Create a private channel
curl -s -X POST https://backend.specterpq.com/api/v1/yellow/channel/create \
-H "Content-Type: application/json" \
-d '{"recipient":"bob.eth","token":"USDC","amount":"1000"}' | jq .
Discover incoming channels
curl -s -X POST https://backend.specterpq.com/api/v1/yellow/channel/discover \
-H "Content-Type: application/json" \
-d '{"viewing_sk":"<HEX>","spending_pk":"<HEX>","spending_sk":"<HEX>"}' | jq .
Check channel config
curl -s https://backend.specterpq.com/api/v1/yellow/config | jq .
/yellow/channel/fund and /yellow/channel/close currently return placeholder values. They demonstrate the API shape but don’t submit real L1 settlement transactions.
Multi-language examples
Here’s how the core flow looks in different languages:
# Generate keys
curl -s -X POST https://backend.specterpq.com/api/v1/keys/generate | jq .
# Create stealth payment
curl -s -X POST https://backend.specterpq.com/api/v1/stealth/create \
-H "Content-Type: application/json" \
-d '{"meta_address":"<META_ADDRESS_HEX>"}' | jq .
// Generate keys
const keys = await fetch ( "https://backend.specterpq.com/api/v1/keys/generate" , {
method: "POST"
}). then ( r => r . json ());
// Create stealth payment
const payment = await fetch ( "https://backend.specterpq.com/api/v1/stealth/create" , {
method: "POST" ,
headers: { "Content-Type" : "application/json" },
body: JSON . stringify ({ meta_address: keys . meta_address })
}). then ( r => r . json ());
console . log ( "Stealth address:" , payment . stealth_address );
import requests
# Generate keys
keys = requests.post( "https://backend.specterpq.com/api/v1/keys/generate" ).json()
# Create stealth payment
payment = requests.post(
"https://backend.specterpq.com/api/v1/stealth/create" ,
json = { "meta_address" : keys[ "meta_address" ]}
).json()
print ( f "Stealth address: { payment[ 'stealth_address' ] } " )
Quick health check
Make sure the backend is alive:
curl -s https://backend.specterpq.com/health | jq .