Skip to main content

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.

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

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

umarise-1.0.0.tar.gz (8.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

umarise-1.0.0-py3-none-any.whl (10.4 kB view details)

Uploaded Python 3

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

Hashes for umarise-1.0.0.tar.gz
Algorithm Hash digest
SHA256 de30fac6f3c8b6eebe9bdb6be8494f2aaa71a994efd07e287648aa0d85797e13
MD5 abf3fc8f70a30a254b2b401e8e72a8ce
BLAKE2b-256 e90d19dc070e370e4fb007365481361dd3f1da5e1f1d213ed13fefddca605280

See more details on using hashes here.

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

Hashes for umarise-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 6e948537b6b5159ab132e65e7689357f2f88b48c9ec3d0eef42093241867dcba
MD5 ad07d8daca867b441d8dd5699eb104ab
BLAKE2b-256 a426626b6ba283b768945c511fb6eee2224d824ae2d4e8909fcce868553362d0

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page