Upload
Add a file, image, video, folder, link, route, or app resource to protect.
Docs
Upload a private file. Gate by token, NFT collection, or wallet list. Open with a Solana wallet.
Overview
Keycard lets creators, projects, games, DAOs, trading groups, and apps upload protected media, choose a Solana access rule, then share a hosted link, embed, or API gate. Viewers connect Phantom, Backpack, or Solflare, sign once, and Keycard verifies access before opening the content.
Add a file, image, video, folder, link, route, or app resource to protect.
Paste a mint, collection, NFT rule, or wallet list.
Viewers connect Phantom, Backpack, or Solflare and sign once. Keycard checks access server-side.
Passing wallets receive a short-lived session for the private resource.
Instead of email and passwords, the credential is wallet ownership, token balance, NFT ownership, collection membership, or wallet allowlist status.
SPL gates, NFT collection gates, wallet allowlists, encrypted uploads, direct Blob upload, and hosted unlock pages are live.
Hosted drops, rooms, links, and screens for creators, teams, DAOs, games, trading groups, and projects.
A reusable Solana access layer so developers stop rebuilding token-gating logic.
When a wallet fails, Keycard should guide the user to the token, NFT, or wallet path they need.
KEYCARD Vault
Vault is the creator and project product: upload drops, rooms, links, and screens, then gate access by wallet ownership. The current hosted flow starts with one encrypted file per gate; folders, rooms, screens, and video are roadmap items.
Token-gated images, videos, music, PDFs, ZIP packs, and launch assets.
Private file spaces for communities, investors, collectors, teams, and alpha groups.
A private Dropbox-style link backed by wallet verification and expiring sessions.
A branded public page that unlocks into gated files, videos, dashboards, or routes.
KEYCARD Gate
Gate is the developer product path. Hosted unlock pages and REST verification are live; React widgets, no-code embeds, API keys, and webhooks are planned.
{
"name": "Holder Alpha Room",
"conditions": [
{
"type": "spl_balance",
"mint": "TOKEN_MINT_ADDRESS",
"min": "10000"
}
],
"logic": "all"
}Hosted create flow supports a Solana mint and minimum token balance.
Backend verifier supports Helius DAS collection checks.
Public create flow supports pasted wallet lists for private holder, team, or investor links.
React components, no-code embed, domain rules, API keys, and webhooks are the developer product path.
import { KeycardGate } from "@keycard/react";
export default function AlphaRoom() {
return (
<KeycardGate gateId="gate_alpha_001">
<PrivateDashboard />
</KeycardGate>
);
}<KeycardButton
gateId="gate_video_778"
lockedText="Unlock with wallet"
unlockedText="Watch now"
/><script src="https://cdn.keycard.app/gate.js"></script>
<div data-keycard-gate="gate_alpha_001"></div>Get Access
Most gates fail because the wallet does not hold enough of the required token or NFT. Keycard should turn failed checks into acquisition paths for projects: show what is missing, explain token risk, and route the user to Jupiter or the project's chosen get-access URL.
Hosted gates can include a path to Jupiter, a mint page, or project instructions.
Show exactly how many more tokens a wallet needs before access opens.
Surface token verification, liquidity, warnings, and suspicious-token states.
Let users swap into the required token inside the unlock flow.
Telegram bot
Sentinel is the Telegram layer for Keycard. Add it to a group, make it admin, run one setup command, and members verify wallet ownership before they can speak.
Use it for launch rooms, holder chats, CA safety, and token-gated community access.
@keycardsol_bot to the Telegram group./setup keycard in the group./verify or the join prompt to connect a Solana wallet./ca, /buy, /stats, and /recheck for group ops.New group members can be muted until they verify wallet ownership through Keycard.
The bot sends a signed verify link. The wallet signs once, then the server checks the gate rule.
Use /ca in the group to show the official contract address for the configured gate.
When message access is enabled and a different Solana address is posted, Sentinel replies with the official CA.
Use /stats to see verified and pending holder counts.
Admins can recheck holders and keep stale access from staying open.
TELEGRAM_BOT_TOKEN=...
TELEGRAM_WEBHOOK_SECRET=base64url-32-bytes
KEYCARD_SENTINEL_VERIFY_TIMEOUT_SECONDS=300
KEYCARD_SENTINEL_RECHECK_INTERVAL_SECONDS=43200
KEYCARD_TELEGRAM_CARD_IMAGE_URL=https://keycardsol.xyz/og.pngQuickstart
/open/[gateId] URL.Create gate
The live create route accepts form data, verifies SPL mint metadata, encrypts the file, stores it privately, and returns both public and private URLs.
curl -X POST https://keycardsol.xyz/v1/gates \
-F "name=Private launch note" \
-F "description=Only holders can open this file." \
-F "mint=TOKEN_MINT_ADDRESS" \
-F "minAmount=1" \
-F "getAccessUrl=https://pump.fun/coin/TOKEN_MINT_ADDRESS" \
-F "file=@private.pdf"curl -X POST https://keycardsol.xyz/v1/gates \
-F "gateType=allowlist" \
-F "name=Investor deck" \
-F "description=Only listed wallets can open this file." \
-F "walletList=wallet_one,wallet_two" \
-F "file=@deck.pdf"# For files over 4 MB:
# 1. Browser encrypts the file with AES-GCM.
# 2. Browser uploads encrypted bytes through /v1/uploads.
# 3. Browser finalizes /v1/gates with:
uploadedPathname=client-content/...
uploadedName=private.zip
uploadedType=application/zip
uploadedSize=5242897
uploadedEncryptionKey=base64url-32-byte-key{
"gate": {
"id": "5f1b...",
"status": "active",
"conditions": [{ "type": "spl-balance", "label": "1+ TOKEN" }]
},
"openUrl": "/open/5f1b...",
"adminUrl": "/gates/5f1b..."
}Unlock flow
The browser asks the selected Solana wallet for an ed25519 signature over a short-lived Keycard access message. The server validates message shape, wallet match, timestamp freshness, signature, gate status, expiry, and token balance.
Keycard access
Gate: 5f1b...
Wallet: wallet-public-key
Issued: 2026-05-20T16:20:00.000ZAPI
/v1/gatesCreate encrypted gate from multipart form data.
/v1/uploadsIssue private Blob client-upload tokens for browser-encrypted large files.
/v1/gates/[gateId]Read public gate metadata.
/v1/gates/[gateId]Update gate metadata with wallet proof or legacy adminToken.
/v1/verifyVerify wallet signature and token balance.
/content/[gateId]Deliver encrypted content after session validation.
/v1/eventsRecord public view and get-access events.
/v1/telegram/webhookReceive Telegram updates for Sentinel group gates.
/v1/telegram/verifyBind a verified Solana wallet to a Telegram user and open group permissions.
/v1/telegram/recheckProtected holder sweep for configured Telegram groups.
POST /v1/verify
{
"gateId": "5f1b...",
"wallet": "wallet-public-key",
"message": "Keycard access...",
"signature": "base58-ed25519-signature"
}{
"access": true,
"reason": "Wallet passes Private launch note.",
"matched": ["spl-balance"],
"expiresAt": "2026-05-20T16:30:00.000Z",
"contentUrl": "/content/5f1b..."
}Security model
Keycard treats wallet connection as identity transport, not authorization. Authorization requires a fresh signed message, server-side rule checks, private storage, and short-lived content sessions.
Wallet connect alone is not access control. Keycard requires a signed access message.
A verified wallet receives an HTTP-only access cookie for the gate, not a permanent raw file URL.
Uploaded content is encrypted before private Blob storage and decrypted only after session validation.
Large files are encrypted in-browser with per-file keys before private Blob upload.
Premium video should use encrypted HLS segments, expiring playback sessions, and optional watermarking.
Future access can be revoked after token sales. Already-downloaded files cannot be clawed back.
Admin
API-created gates can use creator wallet signatures for admin updates. Legacy browser-created gates still receive a private manage URL.
Checks Helius token accounts for a minimum balance.
Uses DAS search against collection grouping.
Create flow accepts pasted wallets and verifier checks exact wallet membership.
Gate type supports it; creation UI creates one SPL rule.
Environment
Production should use Vercel Blob, strong content/session secrets, and a Helius RPC URL or Helius API key.
BLOB_READ_WRITE_TOKEN=...
KEYCARD_CONTENT_SECRET=base64url-32-bytes
KEYCARD_SESSION_SECRET=base64url-32-bytes
KEYCARD_LAUNCH_MODE=
NEXT_PUBLIC_KEYCARD_LAUNCH_MODE=
KEYCARD_TOKEN_MINT=...
KEYCARD_TOKEN_SYMBOL=$KEYCARD
KEYCARD_TOKEN_DECIMALS=6
KEYCARD_HOLDER_CHAT_MIN_AMOUNT=1
KEYCARD_TOKEN_GET_ACCESS_URL=https://...
KEYCARD_TOKEN_GATE_IDS=...
SOLANA_RPC_URL=https://mainnet.helius-rpc.com/?api-key=...
# or
HELIUS_API_KEY=...
NEXT_PUBLIC_KEYCARD_DOMAIN=keycardsol.xyzRoadmap
$KEYCARD launches as the access token first: holder chat, rooms, partner gates, issuer utility, API quota, embeds, and webhooks roll out from May 26 through August 24, 2026.
$KEYCARD CA, holder chat, holder status checks, launch analytics, and prod wallet reliability checks.
Public room creation, partner gate templates, missing-balance copy, token metadata, and verified issuer pages.
$KEYCARD issuer tiers, gate quotas, creator analytics, API key beta, domain allowlists, and signed admin actions.
@keycard/react beta, no-code embed, webhook beta, Token-2022/cNFT hardening, and developer docs.
A few gates, starter storage, limited unlock checks, and Keycard branding.
More storage, more gates, custom pages, video, and analytics.
API verification, SDK, webhooks, domain allowlists, and higher rate limits.
Custom SLA, dedicated RPC/indexing config, white-label gates, moderation, and enterprise controls.
Files over 4 MB encrypt in-browser and upload directly to private Blob storage.
Phantom, Backpack, and Solflare are supported for ed25519 message signing.
Backend records create, verify, fail, pass, and download events.
Creator-wallet admin auth is available for API-created gates.