API

Seal files and retrieve proof from your terminal or application.

Base URL: https://soulprop.com

Quick start

Seal a file, save your key, and reveal it later. Three commands.

1. Seal a file

Upload any file. You get back a seal ID, encryption key, and RFC 3161 timestamp.

curl -s -F "file=@/mnt/d/project/manuscript.pdf" https://soulprop.com/api/seal

Response:

{
  "id": "BTX4UAWZ",
  "fingerprint": "24f93c199bf3...",
  "key": "+zGszOQ0indzDuVZXwUPGEEjYfj+NCVMFw4K519xpaM=",
  "timestamp": "2026-03-17T09:12:10Z",
  "verifyUrl": "https://soulprop.com/api/seal/BTX4UAWZ",
  "keyFile": {
    "v": 1,
    "id": "BTX4UAWZ",
    "key": "+zGszOQ0indzDuVZXwUPGEEjYfj+NCVMFw4K519xpaM=",
    "fingerprint": "24f93c199bf3...",
    "ts": "2026-03-17T09:12:10Z",
    "url": "https://soulprop.com/api/seal/BTX4UAWZ"
  }
}

2. Save your key

The keyFile object is your key file. We never store the key. If you lose it, your file is permanently inaccessible. Pipe it to a .soulprop file:

curl -s -F "file=@/mnt/d/project/manuscript.pdf" \
  https://soulprop.com/api/seal | jq '.keyFile' > manuscript.soulprop

3. Download evidence

When you need proof, use your key to download a court-ready evidence package.

# Download evidence package (original file + PDF certificate + timestamp token + verify script)
curl -s -X POST https://soulprop.com/api/seal/BTX4UAWZ/evidence \
  -H "Content-Type: application/json" \
  -d '{"encryption_key": "+zGszOQ0indzDuVZXwUPGEEjYfj+NCVMFw4K519xpaM="}' \
  -o evidence.zip

Endpoints

POST /api/seal

Upload and seal a file. Returns seal metadata and your encryption key.

Request

Content-Type: multipart/form-data

FieldTypeDescription
file requiredfileThe file to seal (max 100 MB)

Response

FieldTypeDescription
idstring8-character seal ID
fingerprintstringSHA-256 hash of the sealed content
keystringBase64-encoded 32-byte encryption key. Save this.
timestampstringISO 8601 UTC timestamp from the TSA
verifyUrlstringPublic URL to verify this seal
keyFileobjectReady-to-save key file contents
GET /api/seal/{id}

Get public metadata for a seal. No authentication required.

curl https://soulprop.com/api/seal/ABC12345

Response

FieldTypeDescription
idstringSeal ID
fingerprintstringSHA-256 hash
timestampstringWhen the seal was timestamped
originalSizenumberOriginal file size in bytes
revealedbooleanWhether this seal has been revealed
POST /api/seal/{id}/reveal

Decrypt a sealed file with your encryption key. Returns the original file.

Request body

Content-Type: application/json

FieldTypeDescription
key requiredstringBase64-encoded 32-byte encryption key
curl -X POST https://soulprop.com/api/seal/ABC12345/reveal \
  -H "Content-Type: application/json" \
  -d '{"key": "your-base64-key"}' \
  -o original_file.pdf
POST /api/seal/{id}/evidence

Download a court-ready evidence package as a ZIP file.

Request body

FieldTypeDescription
encryption_key requiredstringBase64-encoded 32-byte encryption key

Evidence package contents

original.* Your decrypted original file
certificate.pdf Human-readable PDF certificate with seal details
timestamp.tsr RFC 3161 timestamp token from FreeTSA
verify.sh OpenSSL script to independently verify the timestamp
curl -X POST https://soulprop.com/api/seal/ABC12345/evidence \
  -H "Content-Type: application/json" \
  -d '{"encryption_key": "your-base64-key"}' \
  -o evidence.zip

# Verify the timestamp independently
unzip evidence.zip -d evidence/
cd evidence && bash verify.sh
POST /api/seal/{id}/delete

Permanently delete a sealed file. Requires your encryption key as proof of ownership. Removes the encrypted blob, fingerprint, and timestamp record. Irreversible.

Request body

Content-Type: application/json

FieldTypeDescription
key requiredstringBase64-encoded 32-byte encryption key
curl -s -X POST https://soulprop.com/api/seal/BTX4UAWZ/delete \
  -H "Content-Type: application/json" \
  -d '{"key": "+zGszOQ0indzDuVZXwUPGEEjYfj+NCVMFw4K519xpaM="}'

Errors

All errors return JSON with error and code fields.

{ "error": "descriptive message", "code": "ERROR_CODE" }
CodeHTTPMeaning
MISSING_FILE400No file in the multipart request
FILE_TOO_LARGE413File exceeds 100 MB limit
RATE_LIMITED429Too many requests, try again shortly
SEAL_NOT_FOUND404Seal ID doesn't exist
WRONG_KEY400Decryption key doesn't match
TIMESTAMP_UNAVAILABLE503TSA temporarily unavailable, retry

Seal and save your key in one line

curl -s -F "file=@/mnt/d/project/file.zip" https://soulprop.com/api/seal | jq '.keyFile' > file.soulprop