Back to blog
Guides

Verify a Bitcoin timestamp yourself: step-by-step tutorial (no LegalStamp required)

You have a .ots file from LegalStamp or any other OpenTimestamps service. Here are three methods to verify the proof yourself, two of which are completely independent of our website.

11 min read
Verify a Bitcoin timestamp yourself: step-by-step tutorial (no LegalStamp required)

You have received a contract.pdf file along with a contract.pdf.ots. The second is supposed to prove that the first existed at a given date. How can you verify this claim yourself, without having to trust the service that produced the .ots?

That is exactly what this tutorial covers. Three methods, from simplest to most rigorous, to verify an OpenTimestamps timestamp — the open standard that LegalStamp and several other services build upon. Two of these methods do not go through our website. That is intentional.

i
This article is not about creating timestamps

To learn how to create an OpenTimestamps timestamp, read our practical creation guide. Here, we focus exclusively on the verification of an already-issued proof.

Why verifying it yourself changes everything

An electronic timestamp only carries evidentiary weight if the opposing party — or a judge, a peer, or simply your future self — can independently verify that the proof holds. If verification depends solely on the service that issued the certificate, you are transferring all the trust to that provider. What happens if they shut down? Change their terms? Get acquired? Your proof becomes unusable.

OpenTimestamps was designed in 2016 by Peter Todd (Bitcoin Core developer) precisely to avoid that trap. The .ots format is open and documented (public specification), and any compatible client can verify a proof produced by any other. Trust is carried by Bitcoin and by the standard, not by the issuer.

This is also at the heart of LegalStamp's argument: we make creation easier, but verification stays completely independent of us.

What verification actually proves

Before running a command, it helps to understand what is being verified. An OpenTimestamps proof establishes two things:

  1. The SHA-256 hash of the original file matches the one recorded inside the .ots proof.
  2. That hash was anchored in the Bitcoin blockchain at a specific date (the date of the mined block containing the anchor transaction).

In practice: if you change even a single character of the original file, the hash changes and verification fails immediately. If the Bitcoin transaction does exist in a dated block, the attestation date is locked — a miner cannot rewrite history without rewriting the entire chain, which is economically and technically out of reach.

!
What is not proven

The timestamp says nothing about the author, the intent, the content, or the legal validity of the file. It only attests that this exact content existed at this exact date. It is a piece of evidence within a body of evidence, not an absolute demonstration.

The three available methods

MethodDifficultyIndependenceWhen to use it
LegalStamp /verify pageVery easyDepends on our websiteQuick daily verification
Official opentimestamps.org websiteEasyIndependent of LegalStampThird-party verification, demonstration
ots-cli command lineTechnicalFully autonomousAudit, verification against a local Bitcoin node

Each method produces the same cryptographic result. The difference lies in the trust chain you mobilize.

Method 1: the LegalStamp /verify page

The simplest one. You drag your original file and its .ots into the drop zone, and the page immediately shows the Bitcoin anchor date and the block number.

Upside: zero installation, readable interface, verification in seconds. Limit: trust rests on the code we serve. For daily use that is fine, but for an adversarial demonstration methods 2 or 3 are preferable.

Try it on /verify →

Method 2: the official opentimestamps.org website

The OpenTimestamps project maintains an official web verifier, completely independent of any commercial service.

  1. 1
    Open opentimestamps.org
    Go to https://opentimestamps.org. The Verify section is on the homepage.
  2. 2
    Upload the original file
    Drop the file whose timestamp you want to verify (e.g. contract.pdf). The SHA-256 hash is computed locally in your browser; the content is not transmitted.
  3. 3
    Upload the matching .ots
    In the second area, drop the corresponding proof file (contract.pdf.ots).
  4. 4
    Read the result
    The verifier shows the Bitcoin block number, the precise UTC date, and the status. If the hash does not match or the proof is incomplete, an explicit error message indicates why.

This method is ideal to show a peer, a client, or a lawyer that the proof holds without going through your provider.

Method 3: the ots-cli command line (the most rigorous)

For those who want to verify without depending on any web service — including the OpenTimestamps one — the answer is the command-line client. It queries a public Bitcoin explorer directly, or better, your own local Bitcoin node.

  1. 1
    Install the Python client
    On macOS or Linux: pip install opentimestamps-client. Requires Python 3.7 or higher. On Windows, WSL is recommended. Verify with ots --version.
  2. 2
    Place both files in the same folder
    The client looks for the original file next to the .ots. If your proof is named contract.pdf.ots, the original file must be named contract.pdf.
  3. 3
    Inspect the proof (optional)
    ots info contract.pdf.ots displays the internal structure: calendar servers used, Bitcoin attestation if present, Merkle path. Useful to understand the state of the proof without validating it.
  4. 4
    Run the verification
    ots verify contract.pdf.ots queries a public Bitcoin explorer (by default) to retrieve the Merkle root of the relevant block and confirm the anchor. Response in a few seconds.
  5. 5
    Verify against a local Bitcoin node (optional)
    If you run bitcoind: ots --bitcoin-node verify contract.pdf.ots. No dependency on a third-party explorer, 100% autonomous verification.

Full example

bash
# 1. Installation
pip install opentimestamps-client

# 2. Make sure both files are present
ls -la contract.pdf*
# -rw-r--r--  1 user  staff  82341 May 02 10:14 contract.pdf
# -rw-r--r--  1 user  staff    540 May 02 10:15 contract.pdf.ots

# 3. Inspect the proof
ots info contract.pdf.ots
# File sha256 hash: 3a7bd3e2360a3d29eea436fcfb7e44...
# Timestamp:
# append e5b7...
# sha256
# verify BitcoinBlockHeaderAttestation(845231)

# 4. Verify
ots verify contract.pdf.ots
# Assuming target filename is 'contract.pdf'
# Success! Bitcoin block 845231 attests existence as of 2026-05-02 11:24:18 UTC

The Success! line is the cryptographic verdict. It means the SHA-256 hash of contract.pdf matches the one anchored in Bitcoin block 845231, mined at 11:24:18 UTC on May 2, 2026. Any later modification of the file — adding a character, changing a metadata field — would produce a different hash and break the verification.

i
Why the Bitcoin block and not the transaction?

The attestation date is that of the block containing the anchor transaction, not the time the transaction was sent. Precision is roughly 10 minutes (average block time), which is more than enough for the vast majority of disputes.

Practical scenarios

You receive a .ots from a peer

A lawyer sends you a file and its .ots as an attachment. Before adding it to your case file, verify it. Methods 2 or 3 give you cryptographic certainty that the proof holds, regardless of the service that issued it.

You verify five years later

You find in your archives a contract timestamped in 2026. The service that issued it may no longer exist. No problem: as long as you have the original file and the .ots, the CLI or the official OpenTimestamps website will reconfirm the Bitcoin anchor date. The blockchain has not forgotten.

You produce the proof in court

The expert witness appointed by the opposing party will want to reproduce the verification independently. Documenting the protocol (CLI method, client version, exact command, full output) reinforces the credibility of the case file. That is a virtue few digital evidence formats offer.

So what is LegalStamp for?

Let's be clear: if verification is fully open, what are we for?

To handle creation and the lifecycle of the proof. Computing the SHA-256 hash in the browser without sending the file, submitting to multiple calendar servers, automatically retrieving the Bitcoin attestation once confirmed, archiving the .ots, tracking dozens or hundreds of files from a dashboard, handling GDPR. That is the invisible work that turns an open standard into a tool you can actually use day to day.

But verification stays public. That is a deliberate design choice: your proof must never depend on our survival. If LegalStamp disappears tomorrow, your .ots files will remain verifiable with any OpenTimestamps client. That is our strongest trust argument, and it is also the very nature of an open standard anchored on Bitcoin.

LegalStamp is a non-qualified electronic timestamping service under eIDAS: the proof does not carry the legal presumption reserved for qualified providers (QTSPs). However, Article 41(1) of the eIDAS regulation prohibits denying admissibility to an electronic timestamp on the sole ground that it is non-qualified. Combined with the robustness of Bitcoin and independent verifiability, the proof retains real evidentiary value.

Verify in two clicks

If you already have a .ots file at hand, the LegalStamp /verify page accepts drag-and-drop and shows the result instantly. For a verification fully independent of our website, the opentimestamps.org form or the ots-cli do the same job. Open /verify →

FAQ

No, and that is the whole point of OpenTimestamps. The standard is open: any OpenTimestamps client (the official opentimestamps.org website, the Python ots-cli command line, the JavaScript library) can verify a .ots file, including when you no longer have access to LegalStamp. The proof belongs to the format, not to the issuing service.
No. You need the .ots file and the original file it attests. The .ots does not contain the content, only the SHA-256 hash and the Merkle path to Bitcoin. Without the original file, it is impossible to recompute the hash and therefore to prove what the proof refers to.
No, but it is the most rigorous option. Without a local node, the client queries public Bitcoin explorers (Blockstream, Mempool.space) to retrieve the Merkle root of the block and confirm the attestation. The verification is valid in both cases, only the trust chain differs.
Partially. You can inspect the structure of the .ots offline with ots info, but the final verification requires fetching the Merkle root of the relevant Bitcoin block, so a connection to a node or an explorer. Once retrieved, the information can be archived for later offline verification.
The proof remains verifiable. Once anchored on Bitcoin, the aggregated hash is written in a mined block that cannot be modified. As long as Bitcoin exists and you keep the .ots and the original file, any OpenTimestamps client will confirm the anchor date.
A few seconds for the command itself, plus the network time to query a Bitcoin explorer. In practice, count on 5 to 15 seconds per file on a decent connection. With a synchronized local Bitcoin node, the response is nearly instantaneous.
LegalStamp handles creation (in-browser hash computation, submission to calendar servers, automatic retrieval of the Bitcoin attestation), .ots archiving, multi-file tracking, the web interface, and GDPR compliance. Verification, on the other hand, stays public and independent. This separation is the core of our trust argument.

Conclusion

Knowing how to verify an OpenTimestamps timestamp yourself is not a technical detail: it is what separates a truly useful proof from a certificate that depends on a single provider. Three methods coexist, from the simplest web form to the most rigorous CLI, and all produce the same cryptographic verdict. That is the very definition of an open standard anchored on a public blockchain.

For LegalStamp, this independence is not a bug: it is the core feature. You can leave us tomorrow; your proofs will keep existing.

Disclaimer: this article is provided for educational purposes. It describes the technical procedure for verifying an OpenTimestamps timestamp. The evidentiary weight of a proof in a specific legal context will always depend on the overall case, the applicable procedural rules, and the sovereign assessment of the judge.

Jeremy

Jeremy

Fondateur de LegalStamp, passionne par la blockchain et la protection des creations.

Share:

Related articles

Ready to protect your creations?

Create your first proof of priority for free in less than 30 seconds.