Quickstart (v0.2)
Flow: (1) compute SHA-256 locally → (2) POST /api/timestamp → (3) save the .tproof.json proof →
(4) verify later with /api/verify using the proof.
# 1) Hash locally (example)
# sha256sum myfile.bin | awk '{print $1}'
# 2) Timestamp: server signs the hash and returns a proof
curl -sS https://api.timeproofs.io/api/timestamp \
-H "Content-Type: application/json" \
-d '{
"hash":"<sha256-hex>",
"type":"document",
"meta":{"source":"cli"}
}' | tee proof.tproof.json
# 3) Verify later (proof-based)
# Option A (recommended): requires jq
jq -c '{bundle:.}' proof.tproof.json | \
curl -sS https://api.timeproofs.io/api/verify \
-H "Content-Type: application/json" \
-d @-
# Option B (no jq): paste the proof JSON into "bundle" manually
# curl -sS https://api.timeproofs.io/api/verify -H "Content-Type: application/json" -d '{"bundle":{...}}'
Endpoints
Base URL: https://api.timeproofs.io/api
POST /timestamp
POST https://api.timeproofs.io/api/timestamp
Content-Type: application/json
Accept: application/json
{
"hash": "64-hex-sha256",
"type": "document",
"meta": { "source": "web" }
}
POST /verify
POST https://api.timeproofs.io/api/verify
Content-Type: application/json
Accept: application/json
{
"bundle": { ...the .tproof.json content... }
}
Proof file (.tproof.json)
A proof contains only hash + timestamp + signature (and optional meta). Your original content is never stored.
{
"version": "timeproofs-0.2",
"hash": {
"algorithm": "SHA-256",
"value": "sha256-hex"
},
"timestamp": {
"issuedAt": "2025-11-04T10:22:33.123Z",
"issuer": "https://api.timeproofs.io",
"nonce": "hex-128bit"
},
"proof": {
"algo": "Ed25519",
"signature": "hex-signature",
"keyId": "tp-v0-2-main"
},
"meta": {
"type": "document",
"source": "web:docs"
}
}
Errors
Clients should treat errors as HTTP status + a human message. Do not hardcode undocumented error codes.
Typical error payload (example)
{
"error": "bad_request",
"message": "Hash must be 64 hex characters."
}
Your integration should always handle: non-JSON responses, missing fields, and unexpected shapes.
Offline
“Offline” means you can keep, move, inspect, and archive the proof file locally anytime. A proof is self-contained: it carries the hash, timestamp, and signature.
For cryptographic validation, you need a verifier that knows TimeProofs public keys:
you can use the TimeProofs API (/api/verify) when online, or any ProofSpec-compatible verifier that supports the same keys.
Practical workflow: store .tproof.json next to the original file, keep both immutable, and re-verify after transfers/pipelines.
FAQ
Do you store my content?
No. Your original file stays with you. Proofs are hash-only.
Why is v0.2 “stateless”?
Verification uses the proof file, not a database lookup.
Is a file date enough?
No. File dates are local and editable. TimeProofs signs a cryptographic fingerprint at a precise time.
Is this notarization / legal certification?
No. TimeProofs provides a technical proof of existence and integrity, not a legal qualification.