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
/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
/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
| Field | Type | Description |
|---|---|---|
key required | string | Base64-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" }
| Code | HTTP | Meaning |
|---|---|---|
MISSING_FILE | 400 | No file in the multipart request |
FILE_TOO_LARGE | 413 | File exceeds 100 MB limit |
RATE_LIMITED | 429 | Too many requests, try again shortly |
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 -F "file=@/mnt/d/project/file.zip" https://soulprop.com/api/seal | jq '.keyFile' > file.soulprop