Dead Drop · Schema

Drop

A dead-drop ephemeral data share. Free tier: 10KB, 7-day lifespan. Deep tier: 4MB, 90-day lifespan. Private drops are end-to-end encrypted client-side (zero-knowledge); public drops are plaintext.

MessagingPrivacyAnonymousOpen Source

Properties

Name Type Description
id string SHA-256 hash of the drop name.
name string Human-friendly 4-word kebab-case drop name generated from the EFF Diceware wordlist.
tier string Drop tier. Free: 10KB, 7 days. Deep: 4MB, 90 days.
visibility string Drop visibility. Private drops are encrypted; public drops are plaintext.
payload string For private drops: hex-encoded AES-GCM ciphertext. For public drops: raw content string.
salt string Hex-encoded 16-byte salt for PBKDF2 key derivation.
iv stringnull Hex-encoded 12-byte AES-GCM initialization vector. Null for public drops.
encryptionAlgo stringnull Encryption algorithm identifier. Null for public drops.
encryptionParams objectnull
mimeType string MIME type of drop content.
hashAlgo string Hash algorithm used for the drop id and admin authentication.
contentHash string SHA-256 hash of the canonical content payload JSON. Used for optimistic concurrency and admin auth.
expiresAt string ISO 8601 timestamp at which the drop expires and is purged.
View JSON Schema on GitHub

JSON Schema

dead-drop-drop-schema.json Raw ↑
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://raw.githubusercontent.com/api-evangelist/dead-drop/main/json-schema/dead-drop-drop-schema.json",
  "title": "Drop",
  "description": "A dead-drop ephemeral data share. Free tier: 10KB, 7-day lifespan. Deep tier: 4MB, 90-day lifespan. Private drops are end-to-end encrypted client-side (zero-knowledge); public drops are plaintext.",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "pattern": "^[a-f0-9]{64}$",
      "description": "SHA-256 hash of the drop name."
    },
    "name": {
      "type": "string",
      "description": "Human-friendly 4-word kebab-case drop name generated from the EFF Diceware wordlist."
    },
    "tier": {
      "type": "string",
      "enum": ["free", "deep"],
      "description": "Drop tier. Free: 10KB, 7 days. Deep: 4MB, 90 days."
    },
    "visibility": {
      "type": "string",
      "enum": ["private", "public"],
      "description": "Drop visibility. Private drops are encrypted; public drops are plaintext."
    },
    "payload": {
      "type": "string",
      "description": "For private drops: hex-encoded AES-GCM ciphertext. For public drops: raw content string."
    },
    "salt": {
      "type": "string",
      "pattern": "^[a-f0-9]{32}$",
      "description": "Hex-encoded 16-byte salt for PBKDF2 key derivation."
    },
    "iv": {
      "type": ["string", "null"],
      "pattern": "^[a-f0-9]{24}$",
      "description": "Hex-encoded 12-byte AES-GCM initialization vector. Null for public drops."
    },
    "encryptionAlgo": {
      "type": ["string", "null"],
      "enum": ["pbkdf2-aes256-gcm-v1", null],
      "description": "Encryption algorithm identifier. Null for public drops."
    },
    "encryptionParams": {
      "type": ["object", "null"],
      "properties": {
        "rounds": {
          "type": "integer",
          "minimum": 1,
          "description": "PBKDF2 iteration count."
        }
      }
    },
    "mimeType": {
      "type": "string",
      "enum": ["text/plain"],
      "description": "MIME type of drop content."
    },
    "hashAlgo": {
      "type": "string",
      "enum": ["sha-256"],
      "description": "Hash algorithm used for the drop id and admin authentication."
    },
    "contentHash": {
      "type": "string",
      "pattern": "^[a-f0-9]{64}$",
      "description": "SHA-256 hash of the canonical content payload JSON. Used for optimistic concurrency and admin auth."
    },
    "expiresAt": {
      "type": "string",
      "format": "date-time",
      "description": "ISO 8601 timestamp at which the drop expires and is purged."
    }
  },
  "required": ["id", "tier", "visibility", "payload", "salt", "mimeType", "hashAlgo", "expiresAt"]
}