VeilDrop logo

VeilDrop API

Disposable email addresses, fully programmable. Receive and send anonymous emails from any language — no API key, no signup, no cookies.

Free forever No API key REST / JSON EU-hosted

Why no API key?

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.

Quick start

📥 ReceiveCreate an inbox, poll for messages
📤 SendSend anonymous emails with a Reply-To
🔑 RecoverSame phrase = same address, always
🔥 BurnPermanently delete an inbox in one call

Endpoints

MethodEndpointPurpose
POST/api/v1/inboxCreate an inbox (optionally from a mnemonic)
GET/api/v1/inbox/:id/messagesList all messages
GET/api/v1/inbox/:id/message/:msgIdRead one message (marks as read)
POST/api/v1/inbox/:id/sendSend an email from this inbox address
POST/api/v1/inbox/:id/extendExtend the inbox lifetime
DELETE/api/v1/inbox/:idBurn the inbox permanently
GET/api/v1/statusService 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.

1. Create an inbox

# 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"}'
💡 Recovery: recreate the same inbox at any time by posting the same mnemonic. The address and inbox ID are derived from the phrase alone — nothing is stored server-side.

2. Read messages

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

3. Send an email

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).

4. Extend lifetime

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 valueLifetime
10m10 minutes (default)
1h1 hour
1d1 day
20d20 days (max)

5. Burn an inbox

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.

Rate limits & fair use

Error codes

CodeMeaning
401Invalid or missing key (mnemonic)
404Inbox or message not found / expired
409Address already taken
429Rate limit exceeded
400Malformed request
503Service temporarily disabled

Example: Python

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"])

Example: JavaScript (Node)

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);

Privacy & security