Zcan docs
Documentation
How Zcan works.
Zcan is a non-custodial interface: swaps and private sends settle through NEAR Intents market makers, privacy tools run on your device, and agents only act on steps you approve. Every chart on this page is live.
01 · How it works
You send to a one-time deposit address. Solvers compete in an auction to fill the swap, and the winner pays your destination directly. If the guaranteed minimum can't be met, the deposit is refunded.
02 · Order lifecycle
Every order moves through these states, reported by the 1Click status API. The order page polls every 5 seconds; the app refreshes your other open orders every 10 seconds.
Auto-playing · click a state
PENDING_DEPOSIT
The order exists and its deposit address is waiting for your funds. Nothing has moved yet.
03 · Quotes & slippage
A quote has an expected output and a guaranteed minimum. The gap between them is the slippage tolerance. Drag the slider to see the trade-off with live prices.
Zcan requests 1.0% by default.
- Live rate
- —
- Expected
- 0 ZEC
- Guaranteed min
- 0 ZEC
- Worst case
- −$0.00
04 · Networks
Zcan supports whatever NEAR Intents supports, with ZEC always on one side. This chart reads the live asset list.
05 · Private send
Split one amount across up to 10 recipients. Each recipient gets its own order and is paid by a market maker — never from your wallet — and you send each deposit at its scheduled time so the transfers aren't linked by timing.
- Non-custodialEach leg is an independent 1Click order. Nothing is pooled or held by Zcan.
- Unlinked payoutsRecipients see a solver's address, not yours. Uneven splits and delays make legs harder to correlate.
- LimitsDeposit addresses are transparent. For the most privacy, send from a shielded Zcash balance. Delays must fit within each order's deadline (a few hours).
06 · Live data
Prices stream over a WebSocket. Quotes and payouts always come from NEAR Intents; the streamed prices are for display and estimates.
Connecting to market feed…
ZEC/USD
—
—
BTC/USD
—
—
ETH/USD
—
—
SOL/USD
—
—
XRP/USD
—
—
DOGE/USD
—
—
| Data | Source | Freshness |
|---|---|---|
| USD prices (27 assets) | Coinbase WebSocket | Real time · batched 4/s |
| Token list & fallback prices | NEAR Intents /v0/tokens | Every 30 s |
| ZEC 24h history | CoinGecko | Every 5 min + live ticks |
| Swap quotes | 1Click dry-run quotes | Every 15 s |
| Order status | 1Click /v0/status | 5 s (order page) · 10 s (background) |
07 · Privacy model
What leaves your device, and to whom, for each feature.
| Feature | Leaves your device | Goes to |
|---|---|---|
| Link cleaner | Nothing | Runs entirely in your browser |
| Photo cleaner | Nothing | Decoding and re-encoding happen on-device |
| Swap / private send | Addresses, amounts | NEAR Intents 1Click (to create and settle the order) |
| Live prices | Nothing about you | Public market feed from Coinbase |
| Privacy agents | What you type into the form | Zcan Privacy Model (model) · Tavily (search queries) |
| Scheduled agent re-checks | Nothing | Stored only in this browser's localStorage |
| Shared agent runs (opt-in) | An anonymized transcript — only if you click Share after a run | Zcan's training store (withdrawable) |
| Order history | Nothing | Stored only in this browser's localStorage |
- Exposure Scout
- Breach Guide
- Access Auditor
- Data Broker Remover
- Account Cleanup
- Social Media Lockdown
- Phishing Checker
- Wallet Hygiene Check
- Travel Privacy Prep
Each agent drafts a plan first, searches the public web only for the steps you approve, and never signs in anywhere for you.
08 · API reference
Zcan's server routes are thin proxies that keep keys server-side. They're the same endpoints the app uses.
GET/api/tokens
Supported assets with USD prices (1Click list, deduplicated).
curl https://your-zcan.app/api/tokensPOST/api/quote
Dry-run or real quote. dry:false returns a one-time deposit address. ZEC must be on one side; same-asset routes (ZEC→ZEC) are allowed.
# recipient: unified u1… or transparent t1…/tex1…; Sapling-only zs1… is rejected
curl -X POST https://your-zcan.app/api/quote \
-H 'content-type: application/json' \
-d '{"from":"nep141:btc.omft.near","to":"nep141:zec.omft.near",
"amount":"0.01","mode":"float","dry":true,
"recipient":"u1…","refundTo":"bc1…"}'GET/api/status?address=…&memo=…
Execution status of an order by its deposit address.
curl 'https://your-zcan.app/api/status?address=bc1q…'POST/api/deposit
Optional: submit your deposit tx hash to speed up detection.
{"txHash":"…","depositAddress":"bc1q…"}GET/api/chart
ZEC/USD over 24 h plus volume and market cap (CoinGecko, cached 1 min).
curl https://your-zcan.app/api/chartPOST/api/agents/plan
Agent drafts a plan (JSON). Nothing is searched yet.
{"agentId":"breach-guide","values":{"breach":"…"}}POST/api/agents/run
Runs only the approved plan; streams NDJSON events.
{"t":"status","text":"Searching the public web…"}
{"t":"search","query":"Example Corp breach 2026"}
{"t":"source","url":"https://…","title":"…"}
{"t":"text","text":"## What happened\n…"}
{"t":"done"}09 · Self-hosting
Zcan is a Next.js app. Every key is optional; features without a key degrade gracefully.
# Swaps (optional; keyless quotes include a 0.2% 1Click fee)
ONECLICK_JWT=
ZCAN_FEE_RECIPIENT= # your NEAR Intents account for a service fee
ZCAN_FEE_BPS= # e.g. 50 = 0.5%
# Privacy agents — any OpenAI-compatible model (DeepSeek by default)
AI_API_KEY=
AI_BASE_URL= # e.g. your own vLLM deployment (deploy/model); empty = DeepSeek
AI_MODEL= # model for reports (required for a custom endpoint)
AI_PLAN_MODEL= # optional faster model for plans
NEXT_PUBLIC_AI_SELF_HOSTED= # true only for a model you deploy yourself
NEXT_PUBLIC_AI_MODEL_NAME= # its name, e.g. "Zcan Privacy Model"
NEXT_PUBLIC_AI_HOST= # GPU host, e.g. "Modal"
NEXT_PUBLIC_AI_PROVIDER= # or: the outside AI company answering
TAVILY_API_KEY= # optional live web search
# Optional: opt-in, anonymized training data for your own model
TRAINING_SIGNING_SECRET= # 32+ random characters
TRAINING_ADMIN_TOKEN= # 24+ chars; GET /api/training/export
KV_REST_API_URL= # Upstash / Vercel KV Redis REST store
KV_REST_API_TOKEN=
# Optional: cookieless usage counts, proxied through /api/event
NEXT_PUBLIC_ANALYTICS= # plausible | umami
ANALYTICS_SITE= # Plausible domain or Umami website id