TAŇBA-OOH Developers

Latest public-ledger days

GET /v1/ledger-days

https://verify.tanba-ooh.kz/v1/ledger-days

The newest 30 days, newest first. For each anchored day the platform computes a Merkle root over the approvals issued and revoked that day and a digest, SHA-256 of the anchor body hash followed by the root, and has the digest timestamped in Bitcoin through OpenTimestamps. status is pending until a Bitcoin block attestation is in the proof, then pending_check until the platform has compared the value the proof commits to with the merkle root in the header of that block, read from two independent block explorers, and anchored with block_height only after that comparison succeeded. Served on the verify and app hosts, cached for 60 seconds.

Authentication

None. This call is public.

Responses

200 The days.

application/json

NameTypeRequiredDescriptionExample
itemsarray of LedgerDayItemyesThe days, newest first.
items[].daystring (date)yesThe Asia/Almaty day the ledger entry covers."2026-10-05"
items[].leaf_countintegeryesNumber of approvals issued and revoked that day.14
items[].merkle_rootstringyesHex SHA-256 root over the day's leaves; SHA-256 of the empty string when the day has none."53f8fe42a83fc01075e856d385cea164e06b7124d4c76b3a498e39de98d7168b"
items[].digeststringyesHex SHA-256 of the anchor body hash followed by the Merkle root; this is what is timestamped."44eeee2dfc054adad906be43d8d227a8052c19e5080b0ed64dc572fad9ee8f46"
items[].statusstringyesHow far the digest has been anchored in Bitcoin. pending, pending_check, anchored
items[].block_heightintegerBitcoin block of the attestation, present only when anchored: after its header was checked against the proof.905432
items[].inputs_urlstringyesAddress of the inputs file of the day."/v1/ledger-days/2026-10-05"
items[].ots_urlstringPresent once the digest has been submitted to the calendars."/v1/ledger-days/2026-10-05/proof.ots"

Example

{
  "items": [
    {
      "day": "2026-10-05",
      "leaf_count": 14,
      "merkle_root": "53f8fe42a83fc01075e856d385cea164e06b7124d4c76b3a498e39de98d7168b",
      "digest": "44eeee2dfc054adad906be43d8d227a8052c19e5080b0ed64dc572fad9ee8f46",
      "status": "pending",
      "block_height": 905432,
      "inputs_url": "/v1/ledger-days/2026-10-05",
      "ots_url": "/v1/ledger-days/2026-10-05/proof.ots"
    }
  ]
}

Errors

Errors are problem documents (application/problem+json) with a stable code.

StatusMeaning
429Rate limit; see Retry-After.

Code samples

curl

curl 'https://verify.tanba-ooh.kz/v1/ledger-days'
Python
import requests

response = requests.get(
    "https://verify.tanba-ooh.kz/v1/ledger-days",
)
print(response.status_code, response.text)
Go
package main

import (
	"fmt"
	"io"
	"net/http"
)

func main() {
	req, err := http.NewRequest("GET", "https://verify.tanba-ooh.kz/v1/ledger-days", nil)
	if err != nil {
		panic(err)
	}
	resp, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()
	data, _ := io.ReadAll(resp.Body)
	fmt.Println(resp.Status, string(data))
}