Skip to main content

umarise

Anchor files to Bitcoin. Verify proofs offline.

Content-blind proof-of-existence infrastructure. Umarise never receives your file, only its SHA-256 hash.

PyPI License: MIT Python 3.9+

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

  1. Hash locally — SHA-256 is computed on your machine. Your file never leaves.
  2. Anchor — The hash is submitted to the Umarise registry and queued for Bitcoin anchoring.
  3. Bitcoin confirms — Within ~2 hours, the hash is embedded in a Bitcoin block via OpenTimestamps.
  4. Verify independently — Anyone with the file and .proof bundle 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 .proof file must be in the same directory as the original file for verify to 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

License

MIT

Release files for umarise 1.0.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for umarise 1.0.0
File Size Uploaded
umarise-1.0.0.tar.gz 8.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for umarise 1.0.0
File Interpreter ABI Platform
umarise-1.0.0-py3-none-any.whl Python 3 none any Details

Total release size: 18.7 kB

Release files / umarise-1.0.0.tar.gz

Download URL umarise-1.0.0.tar.gz
Size 8.3 kB
Tags Source
SHA-256 checksum
How to use checksums
de30fac6f3c8b6eebe9bdb6be8494f2aaa71a994efd07e287648aa0d85797e13
BLAKE2b-256 checksum
How to use checksums
e90d19dc070e370e4fb007365481361dd3f1da5e1f1d213ed13fefddca605280
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.3

Release files / umarise-1.0.0-py3-none-any.whl

Download URL umarise-1.0.0-py3-none-any.whl
Size 10.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
6e948537b6b5159ab132e65e7689357f2f88b48c9ec3d0eef42093241867dcba
BLAKE2b-256 checksum
How to use checksums
a426626b6ba283b768945c511fb6eee2224d824ae2d4e8909fcce868553362d0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.3

Release history Release notifications | RSS feed

This release

1.0.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page