Disposable email addresses, fully programmable. Receive and send anonymous emails from any language — no API key, no signup, no cookies.
Your 15-word recovery phrase is the key. The inbox ID is cryptographically derived from the phrase (SHA-256), so possession of the phrase proves ownership. Nothing to register, nothing to leak, nothing to rotate. You create the inbox with your phrase and read it back with the same phrase — even years later.
| Method | Endpoint | Purpose |
|---|---|---|
| POST | /api/v1/inbox | Create an inbox (optionally from a mnemonic) |
| GET | /api/v1/inbox/:id/messages | List all messages |
| GET | /api/v1/inbox/:id/message/:msgId | Read one message (marks as read) |
| POST | /api/v1/inbox/:id/send | Send an email from this inbox address |
| POST | /api/v1/inbox/:id/extend | Extend the inbox lifetime |
| DELETE | /api/v1/inbox/:id | Burn the inbox permanently |
| GET | /api/v1/status | Service status & limits |
Base URL: https://veildrop.fr. All responses are JSON. Auth: pass your mnemonic as ?key=WORD1 WORD2 ... or the X-API-Key header.
# Create — the server generates your 15-word mnemonic AND a short access token. # Save both: the token is the easy key, the mnemonic is the recovery key. curl -X POST https://veildrop.fr/api/v1/inbox \ -H "Content-Type: application/json" \ -d '{"ttl":"10m"}' # → {"inbox_id":"8f14e45f...","address":"8f14e45fceea167a@veildrop.fr", # "mnemonic":"maid tissue pear room ... peace bacon", # "token":"51d5720a64aa494ab377f5c530a3f68e", # "auth":"mnemonic","key":"maid tissue pear room ... peace bacon",...} # Deterministic address from your own 15-word mnemonic — always the same address curl -X POST https://veildrop.fr/api/v1/inbox \ -H "Content-Type: application/json" \ -d '{"mnemonic":"abandon ability able about above absent absorb abstract absurd abuse access accident","ttl":"1d"}'
Short form — the key is everything, no inbox ID needed. The key can be the mnemonic or the token.
# One variable, that's all you ever need to paste: KEY="51d5720a64aa494ab377f5c530a3f68e" curl -H "X-API-Key: $KEY" https://veildrop.fr/api/v1/mail # or: curl "https://veildrop.fr/api/v1/mail?key=$KEY" # → {"address":"8f14e45fceea167a@veildrop.fr","messages":[{ "id":"...","from":"sender@x.com","subject":"Verify your account","body":"...","attachments":[],"received_at":...,"is_read":false}],...} # Read a single message (also marks it read): curl -H "X-API-Key: $KEY" https://veildrop.fr/api/v1/mail/MESSAGE_ID
curl -X POST -H "X-API-Key: $KEY" -H "Content-Type: application/json" \
https://veildrop.fr/api/v1/send \
-d '{"to":"someone@example.com","subject":"Hello from VeilDrop API","body":"Plain text body","body_html":"HTML body"}'
# → {"ok":true,"email_id":"...","smtp_remaining":190,"provider":"sendpulse"}
The inbox address is set as Reply-To, so the recipient can answer and the reply lands in your inbox. Attachments supported: attachments:[{filename, content(base64), mimeType}] (max 10 files, 5 MB each).
curl -X POST -H "X-API-Key: $KEY" -H "Content-Type: application/json" \
https://veildrop.fr/api/v1/extend -d '{"ttl":"1h"}'
# → {"ok":true,"expires_at":...,"ttl_seconds":3600}
| ttl value | Lifetime |
|---|---|
10m | 10 minutes (default) |
1h | 1 hour |
1d | 1 day |
20d | 20 days (max) |
curl -X DELETE -H "X-API-Key: $KEY" https://veildrop.fr/api/v1/mail
# → {"ok":true,"message":"Inbox permanently deleted"}
Long form (with inbox ID) still works: /api/v1/inbox/:id/messages, /api/v1/inbox/:id/message/:messageId, /api/v1/inbox/:id/send, /api/v1/inbox/:id/extend, DELETE /api/v1/inbox/:id.
Unsubscribe-style disclaimer and abuse-report link.| Code | Meaning |
|---|---|
401 | Invalid or missing key (mnemonic) |
404 | Inbox or message not found / expired |
409 | Address already taken |
429 | Rate limit exceeded |
400 | Malformed request |
503 | Service temporarily disabled |
import requests
BASE = "https://veildrop.fr"
MNEMONIC = "abandon ability able about above absent absorb abstract absurd abuse access accident"
r = requests.post(f"{BASE}/api/v1/inbox", json={"mnemonic": MNEMONIC, "ttl": "1d"})
inbox = r.json()
print("Address:", inbox["address"])
msgs = requests.get(f"{BASE}/api/v1/inbox/{inbox['inbox_id']}/messages",
params={"key": MNEMONIC}).json()
for m in msgs["messages"]:
print(m["from"], "-", m["subject"], "-", m["body"])
const MNEMONIC = "abandon ability able about above absent absorb abstract absurd abuse access accident";
// Create / recover the inbox
const created = await fetch("https://veildrop.fr/api/v1/inbox", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ mnemonic: MNEMONIC, ttl: "1h" }),
}).then(r => r.json());
// Poll for messages
const msgs = await fetch(
`https://veildrop.fr/api/v1/inbox/${created.inbox_id}/messages?key=${encodeURIComponent(MNEMONIC)}`
).then(r => r.json());
console.log(msgs.messages);