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 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.1.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.1.0
File Size Uploaded
mivia_verify-1.1.0.tar.gz 18.9 kB Details

Built distribution (wheel)

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

Total release size: 36.2 kB

Release files / mivia_verify-1.1.0.tar.gz

Download URL mivia_verify-1.1.0.tar.gz
Size 18.9 kB
Tags Source
SHA-256 checksum
How to use checksums
9ecb110aa5ef24a1ba05e83f13c8e64846023328ecb5ea3671b8ecb5d8b09e5d
BLAKE2b-256 checksum
How to use checksums
ddb73537c1197a196d820a3ccf9a349f2c4ebfb37d6de591a3f7a9cf5689121e
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.1.0-py3-none-any.whl

Download URL mivia_verify-1.1.0-py3-none-any.whl
Size 17.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
4a0df3f981ffd4ce6f71b4334fe68ff3e2fd008ba7f143c164a4bc4635318581
BLAKE2b-256 checksum
How to use checksums
a5c9970a92199040e03eb30ef30d3d435c67a04107a78e3655111d1a926b01a7
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

This release

1.1.0 This release

2 release files

1.0.0

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