API

Seal files and retrieve proof from your terminal or application.

Base URL: https://soulprop.com

100 MB
max file size
3
seals per day
7 years
storage retention

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 -X POST https://soulprop.com/api/seal \
  -F "file=@document.pdf"

Response:

{
  "id": "ABC12345",
  "fingerprint": "a1b2c3d4e5f6...",
  "key": "base64-encoded-32-byte-key",
  "timestamp": "2026-01-04T12:00:00Z",
  "verifyUrl": "https://soulprop.com/s/ABC12345",
  "keyFile": { ... }
}

2. Save your key

The key field is your decryption key. We don't store it. If you lose it, your file is gone. Save the response to a .soulprop file:

curl -s -X POST https://soulprop.com/api/seal \
  -F "file=@document.pdf" \
  | jq '.keyFile' > document.soulprop

3. Reveal later

When you need proof, decrypt with your key and download the original file.

# Get your original file back
curl -X POST https://soulprop.com/api/seal/ABC12345/reveal \
  -H "Content-Type: application/json" \
  -d '{"key": "your-base64-key"}' \
  -o revealed_document.pdf

# Download court-ready evidence package
curl -X POST https://soulprop.com/api/seal/ABC12345/evidence \
  -H "Content-Type: application/json" \
  -d '{"encryption_key": "your-base64-key"}' \
  -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

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
DAILY_LIMIT_REACHED4293 seals per day limit reached
RATE_LIMITED429Too many requests (60/min)
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 -X POST https://soulprop.com/api/seal -F "file=@yourfile" | jq '.keyFile' > yourfile.soulprop