Anchor files to Bitcoin. Verify proofs offline. Content-blind proof-of-existence infrastructure.
Project description
umarise
Anchor files to Bitcoin. Verify proofs offline.
Content-blind proof-of-existence infrastructure. Umarise never receives your file, only its SHA-256 hash.
Install
pip install umarise
Quick start (CLI)
# 1. Get your free API key at https://umarise.com/developers
export UMARISE_API_KEY=um_your_key_here
# 2. Anchor a file
umarise anchor contract.pdf
# 3. After ~2 hours (Bitcoin confirmation), get full proof
umarise proof contract.pdf
# 4. Verify — no API key needed, works offline
umarise verify contract.pdf
Expected output
$ umarise anchor contract.pdf
✓ hash computed: sha256:a1b2c3d4e5f6...
✓ anchored: origin_id f47ac10b-58cc-4372-a567-0e02b2c3d479
ℹ proof.ots pending — Bitcoin confirmation takes ~2 hours
✓ certificate saved: contract.pdf.proof
✓ receipt: contract.pdf.certificate.json
$ umarise proof contract.pdf # after ~2 hours
✓ hash: sha256:a1b2c3d4e5f6... (already anchored)
✓ origin_id: f47ac10b-58cc-4372-a567-0e02b2c3d479
✓ anchored in Bitcoin block 943943
✓ no later than: 2026-04-06
✓ saved: contract.pdf.proof
✓ extracted: contract.pdf-proof/
✓ proof valid — independent of Umarise
$ umarise verify contract.pdf
✓ hash matches
✓ anchored in Bitcoin block 943943
✓ no later than: 2026-04-06
✓ proof valid — independent of Umarise
Python SDK
from umarise import UmariseClient
client = UmariseClient(api_key="um_your_key_here")
# Anchor a file (hash computed locally, file never leaves your machine)
result = client.anchor("contract.pdf")
print(result.origin_id) # f47ac10b-...
print(result.hash) # sha256:a1b2c3...
# Check proof status
proof = client.proof(result.origin_id)
if proof.status == "anchored":
print(f"Bitcoin block: {proof.bitcoin_block_height}")
# Anchor a pre-computed hash (for pipelines)
result = client.anchor_hash("sha256:a1b2c3d4e5f6...")
# Resolve metadata (no API key required)
origin = client.resolve(origin_id="f47ac10b-...")
origin = client.resolve(hash="sha256:a1b2c3...")
# Verify a hash (no API key required)
check = client.verify("sha256:a1b2c3d4e5f6...")
if check["found"]:
print(check["origin"])
How it works
- Hash locally — SHA-256 is computed on your machine. Your file never leaves.
- Anchor — The hash is submitted to the Umarise registry and queued for Bitcoin anchoring.
- Bitcoin confirms — Within ~2 hours, the hash is embedded in a Bitcoin block via OpenTimestamps.
- Verify independently — Anyone with the file and
.proofbundle can verify. No API, no account, no Umarise dependency.
The .proof bundle
contract.pdf.proof (ZIP)
├── certificate.json # origin metadata (hash, origin_id, timestamp, block)
├── proof.ots # binary OpenTimestamps proof (Bitcoin anchor)
├── artifact.pdf # copy of the original file (proof command only)
└── VERIFY.txt # verification instructions
Important: The
.prooffile must be in the same directory as the original file forverifyto find it automatically.
CI/CD
For automated anchoring in GitHub Actions, use the official action:
- uses: AnchoringTrust/anchor-action@v1
with:
api-key: ${{ secrets.UMARISE_API_KEY }}
files: dist/build.tar.gz
→ GitHub Marketplace: Umarise Anchor
Pricing
Your API key includes 100 free anchors. No email, no account required.
For production use, see umarise.com/pricing.
Links
- Documentation
- API Reference
- Anchoring Specification
- Independent Verification
- npm CLI (Node.js alternative)
- Status
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file umarise-1.0.0.tar.gz.
File metadata
- Download URL: umarise-1.0.0.tar.gz
- Upload date:
- Size: 8.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
de30fac6f3c8b6eebe9bdb6be8494f2aaa71a994efd07e287648aa0d85797e13
|
|
| MD5 |
abf3fc8f70a30a254b2b401e8e72a8ce
|
|
| BLAKE2b-256 |
e90d19dc070e370e4fb007365481361dd3f1da5e1f1d213ed13fefddca605280
|
File details
Details for the file umarise-1.0.0-py3-none-any.whl.
File metadata
- Download URL: umarise-1.0.0-py3-none-any.whl
- Upload date:
- Size: 10.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6e948537b6b5159ab132e65e7689357f2f88b48c9ec3d0eef42093241867dcba
|
|
| MD5 |
ad07d8daca867b441d8dd5699eb104ab
|
|
| BLAKE2b-256 |
a426626b6ba283b768945c511fb6eee2224d824ae2d4e8909fcce868553362d0
|