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 -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
/api/seal
Upload and seal a file. Returns seal metadata and your encryption key.
Request
Content-Type: multipart/form-data
| Field | Type | Description |
|---|---|---|
file required | file | The file to seal (max 100 MB) |
Response
| Field | Type | Description |
|---|---|---|
id | string | 8-character seal ID |
fingerprint | string | SHA-256 hash of the sealed content |
key | string | Base64-encoded 32-byte encryption key. Save this. |
timestamp | string | ISO 8601 UTC timestamp from the TSA |
verifyUrl | string | Public URL to verify this seal |
keyFile | object | Ready-to-save key file contents |
/api/seal/{id}
Get public metadata for a seal. No authentication required.
curl https://soulprop.com/api/seal/ABC12345
Response
| Field | Type | Description |
|---|---|---|
id | string | Seal ID |
fingerprint | string | SHA-256 hash |
timestamp | string | When the seal was timestamped |
originalSize | number | Original file size in bytes |
revealed | boolean | Whether this seal has been revealed |
/api/seal/{id}/reveal
Decrypt a sealed file with your encryption key. Returns the original file.
Request body
Content-Type: application/json
| Field | Type | Description |
|---|---|---|
key required | string | Base64-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
/api/seal/{id}/evidence
Download a court-ready evidence package as a ZIP file.
Request body
| Field | Type | Description |
|---|---|---|
encryption_key required | string | Base64-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" }
| Code | HTTP | Meaning |
|---|---|---|
MISSING_FILE | 400 | No file in the multipart request |
FILE_TOO_LARGE | 413 | File exceeds 100 MB limit |
DAILY_LIMIT_REACHED | 429 | 3 seals per day limit reached |
RATE_LIMITED | 429 | Too many requests (60/min) |
SEAL_NOT_FOUND | 404 | Seal ID doesn't exist |
WRONG_KEY | 400 | Decryption key doesn't match |
TIMESTAMP_UNAVAILABLE | 503 | TSA 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