Skip to content

Zcan docs

Live · interactive

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.

S1S2S3S4YOUR WALLETany coinDEPOSIT ADDRone-timeDESTINATIONpaid by solverNEAR INTENTS · SOLVER AUCTIONREFUND PATH · if the minimum can't be met

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.

PENDING DEPOSITDEPOSIT SEENPROCESSINGSUCCESSINCOMPLETEREFUNDEDFAILED

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
00.510.1%1%2%3%EXPECTED1.0% SLIPPAGEMIN 0 ZEC
Higher tolerance makes a fill more likely but lowers the guaranteed minimum. If the market moves past it, your deposit is refunded.

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.

+0m+20m+40m+60m+80m
Leg 1 · 41.6%
Leg 2 · 20.5%
Leg 3 · 37.9%
You send deposit Solver fills Recipient paid
  • 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).
Open private send

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

    —

    —

DataSourceFreshness
USD prices (27 assets)Coinbase WebSocketReal time · batched 4/s
Token list & fallback pricesNEAR Intents /v0/tokensEvery 30 s
ZEC 24h historyCoinGeckoEvery 5 min + live ticks
Swap quotes1Click dry-run quotesEvery 15 s
Order status1Click /v0/status5 s (order page) · 10 s (background)

07 · Privacy model

What leaves your device, and to whom, for each feature.

FeatureLeaves your deviceGoes to
Link cleanerNothingRuns entirely in your browser
Photo cleanerNothingDecoding and re-encoding happen on-device
Swap / private sendAddresses, amountsNEAR Intents 1Click (to create and settle the order)
Live pricesNothing about youPublic market feed from Coinbase
Privacy agentsWhat you type into the formZcan Privacy Model (model) · Tavily (search queries)
Scheduled agent re-checksNothingStored only in this browser's localStorage
Shared agent runs (opt-in)An anonymized transcript — only if you click Share after a runZcan's training store (withdrawable)
Order historyNothingStored only in this browser's localStorage
9 privacy agents
  • 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).

Request
curl https://your-zcan.app/api/tokens

POST/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.

Request
# 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.

Request
curl 'https://your-zcan.app/api/status?address=bc1q…'

POST/api/deposit

Optional: submit your deposit tx hash to speed up detection.

Request
{"txHash":"…","depositAddress":"bc1q…"}

GET/api/chart

ZEC/USD over 24 h plus volume and market cap (CoinGecko, cached 1 min).

Request
curl https://your-zcan.app/api/chart

POST/api/agents/plan

Agent drafts a plan (JSON). Nothing is searched yet.

Request
{"agentId":"breach-guide","values":{"breach":"…"}}

POST/api/agents/run

Runs only the approved plan; streams NDJSON events.

Response stream
{"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.

.env.local
# 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
Esc

Order feed

0 active · 0 total

No orders yet

Swaps you create on this device appear here with live status.

Stored only in this browser · statuses refresh every 10 s