Skip to main content

mivia-verify

Check a Mivia evidence pack yourself, without relying on Mivia.

Every recording registered with Mivia has a public Certificate of Registration. Its owner can download an evidence pack: a zip with the signed registration record, its Bitcoin timestamp and Mivia's signed, dated statement about the record. This tool checks every part of a pack and tells you, in plain language, what passed.

What a pack proves: what was registered, by which Mivia account, and that the record existed no later than a given Bitcoin block. What it does not prove: who wrote the music or who owns it. That is for contracts, registries and courts.

Install

Python 3.9 or later:

pip install git+https://github.com/MiviaCo/mivia-verify

To compare an audio file by its acoustic fingerprint, also install Chromaprint's fpcalc (brew install chromaprint, apt install libchromaprint-tools, or https://acoustid.org/chromaprint).

Use

mivia-verify mivia-evidence-<id>-<date>.zip
mivia-verify mivia-evidence-<id>-<date>.zip --audio the-recording.wav
Option What it does
--audio FILE Check whether FILE is the exact registered file, and whether it matches the registered recording by fingerprint
--offline No network at all: skips comparing keys with mivia.co and looking up the Bitcoin block
--bitcoin-node Look the block up with your own Bitcoin node (bitcoin-cli) instead of a public block explorer
--json Machine-readable output

The exit code is 0 when every check that could run passed, and 1 otherwise.

What it checks

  1. The record is intact. BLAKE3 of 1-registration/manifest.json gives the record id, the same id as in the certificate address mivia.co/c/<id>.
  2. Signed by Mivia. The Ed25519 signature in manifest.sig is valid for the record.
  3. The keys are Mivia's. The keys in the pack match the copy pinned in this repository (src/mivia_verify/keys.py) and the copy published at https://mivia.co/.well-known/mivia-keys.json.
  4. The Bitcoin timestamp. The OpenTimestamps proof starts from the record's BLAKE3 hash and leads to the merkle root of a Bitcoin block, confirmed with a public block explorer or your own node. Nobody, including Mivia, can backdate it.
  5. The watermark payload (web registrations) points to this record and to Mivia's key. Reading the payload from audio needs Mivia's decoder or the public scan on mivia.co; this tool checks that the payload in the pack belongs to the record.
  6. Mivia's dated statement is signed by Mivia's statement key and lists every other file in the pack with its SHA-256, so nothing can be added, removed or changed. It is Mivia's account on the date shown (assurance level, warnings, creation history, lineage, scan dates); a later pack may say more.
  7. The audio (with --audio):
    • exact file: for records registered from October 2026, the record contains the SHA-256 of the file that was uploaded; a creator who kept that file can prove it is the one;
    • fingerprint: compared with the registered Chromaprint fingerprint. A similarity measure: it also matches re-encoded or edited copies.

A check that could not run (offline, no proof yet, no fingerprint) is shown as ----, not as a failure.

You do not have to trust this tool either: SPEC.md describes the pack precisely enough to write your own checker.

Licence

Apache-2.0. This repository contains the pack format and the checks only; Mivia's watermarking engine is not part of it.

Metadata

Release files for mivia-verify 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 mivia-verify 1.0.0
File Size Uploaded
mivia_verify-1.0.0.tar.gz 17.7 kB Details

Built distribution (wheel)

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

Total release size: 34.1 kB

Release files / mivia_verify-1.0.0.tar.gz

Download URL mivia_verify-1.0.0.tar.gz
Size 17.7 kB
Tags Source
SHA-256 checksum
How to use checksums
fca7ddf67577403e98601532ef9f463f055cfe6d121f7ef5f7ba5d6b03376218
BLAKE2b-256 checksum
How to use checksums
ee21033328392a31dba260e6c95d6930e88e1458fef0ce8a0580de2f36579631
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 16, 2026.

Transparency log

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

Download URL mivia_verify-1.0.0-py3-none-any.whl
Size 16.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
04bc3d820e5a07d4f54c0c47ad3e32e6ef319754bc7d29e8b190cc337f86213e
BLAKE2b-256 checksum
How to use checksums
9afde0daf5031ed66d7bab020756b62deb4d2dcb10ec58271945ec5e4a935451
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 16, 2026.

Transparency log

Release history Release notifications | RSS feed

1.2.0

2 release files

1.1.0

2 release files

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