API
Create self-destructing messages, with or without an on-chain proof, from your own systems. The zero-knowledge guarantee is unchanged: you encrypt the content and send us ciphertext — we never receive a key, over the API just as in the browser.
API access is included with Pro and Business. Create a key under Account → API keys.
Authentication
Every request carries your key as a bearer token.
Authorization: Bearer signet_live_xxxxxxxxxxxxxxxx
Base URL: https://basignet.com/api
Encrypt first (client side)
You encrypt the payload before sending it. The scheme is AES-256-GCM under a key derived from a random 256-bit secret (and an optional password) with PBKDF2. The stored blob is:
magic 4 bytes "SIGNET" version 1 byte 0x01 flags 1 byte bit0 = password required salt 16 bytes PBKDF2 salt iv 12 bytes AES-GCM nonce body n bytes ciphertext ‖ 16-byte tag
You send that blob, base64-encoded, as ciphertext. The 256-bit secret is yours — it becomes the fragment of the share link and must never be sent to us. The open-source reference implementation of this format is the same one the web app uses.
Create a message
POST /api/signet
curl https://basignet.com/api/signet \
-H "Authorization: Bearer signet_live_..." \
-H "Content-Type: application/json" \
-d '{
"ciphertext": "<base64 of the SIGNET blob>",
"expiresIn": "24h",
"maxViews": 1,
"anchor": true,
"passwordProtected": false,
"label": "Case 2026-114"
}'expiresIn: one of 1h, 12h, 24h, 3d, 7d, 30d. maxViews: 1–10, ornull for unlimited. anchor: true to leave an on-chain proof (counts against your monthly quota). label is optional and is the one field we can read.
Response:
{
"token": "kR8vN2xQpL4mT7yZ",
"expiresAt": "2026-07-19T14:32:00.000Z",
"anchor": true,
"anchorStatus": "pending",
"contentHash": "0x8f2a…c41d"
}Build the share link yourself by appending your secret as the fragment — it is the only place the two halves meet:
https://basignet.com/w/{token}#{yourBase64UrlSecret}Read metadata (no view spent)
GET /api/signet/{token} — public, spends no read. Returns whether it exists, its expiry, reads left, whether it is password-protected, and whether it is anchored.
Claim (spend a view)
POST /api/signet/{token}/claim — public. Spends one view and returns the ciphertext, which you decrypt with your secret. It is a POST, never a GET, so link-preview bots cannot burn a one-time message by fetching it.
{ "ciphertext": "<base64 SIGNET blob>", "burned": true }Destroy early
POST /api/signet/{token}/burn — owner only (your key). Destroys the content ahead of expiry. Needs no key: we destroy what we cannot read.
Errors
401 missing or invalid key. 402 monthly proof quota reached (send it unanchored, or upgrade). 410 the message is gone. 413 payload too large. 429 rate limited.