TAŇBA-OOH Developers

One daily seal of the received play statistics

GET /v1/stats-seals/{day}

https://verify.tanba-ooh.kz/v1/stats-seals/{day}

The seal of the statistics batches received on one Asia/Almaty calendar day (YYYY-MM-DD): the signed body, the signature, and where the seal sits in the public ledger. A day is sealed once, after it is over, so a batch that arrives late belongs to the day it arrived. By default the answer is JSON; ?format=p7s returns the signature itself (PKCS#7 with the body attached). Verify offline with tanba-verify seal FILE.json --ca root.pem. ledger is null until the ledger day that holds the seal has been digested.

Authentication

None. This call is public.

Parameters

NameInTypeRequiredDescriptionExample
daypathstringyesThe Asia/Almaty receive day.2026-10-13
formatquerystringnop7s returns the signature file instead of JSON. p7sp7s

Responses

200 The seal.

application/json

StatsSeal

NameTypeRequiredDescriptionExample
daystring (date)yesThe sealed Asia/Almaty receive day."2026-10-13"
signed_atstringyesWhen the seal was made, Asia/Almaty time."2026-10-14T00:31:07+05:00"
bodyobjectyesThe signed content of a seal, canonical JSON (RFC 8785).
body.vconstyesBody version.1
body.envstringyesThe environment that made the seal. test, prod
body.daystring (date)yesThe sealed Asia/Almaty receive day."2026-10-13"
body.batch_countintegeryesNumber of accepted statistics batches received on the day.4812
body.record_countintegeryesNumber of play records in those batches.96240
body.rootstringyesHex Merkle root over the batch leaves, ordered by receive time then batch number. A leaf is the SHA-256 of the canonical JSON of the batch number, its owner, its sequence number, the SHA-256 of its body and its receive time (UTC, microseconds). Nodes are SHA-256(0x01, left, right), as in the public ledger."0f59838f53129a98e19ac704aa86cde6d83fc6cce9c56106370a60cbd6341fa3"
body.prev_seal_sha256stringyesHex SHA-256 of the previous seal's body; 64 zeros for the first seal."0000000000000000000000000000000000000000000000000000000000000000"
signaturestringyesThe CMS signature (PKCS#7, status key, body attached), base64."MIIGjwYJKoZIhvcNAQcCoIIGgDCCBnwCAQExDzANBglghkgBZQMEAgEFADA..."
ledgeroneOfyesWhere the seal sits in the public ledger, or null until the ledger day that holds it has been digested.

Example

{
  "day": "2026-10-13",
  "signed_at": "2026-10-14T00:31:07+05:00",
  "body": {
    "v": 1,
    "env": "prod",
    "day": "2026-10-13",
    "batch_count": 4812,
    "record_count": 96240,
    "root": "0f59838f53129a98e19ac704aa86cde6d83fc6cce9c56106370a60cbd6341fa3",
    "prev_seal_sha256": "0000000000000000000000000000000000000000000000000000000000000000"
  },
  "signature": "MIIGjwYJKoZIhvcNAQcCoIIGgDCCBnwCAQExDzANBglghkgBZQMEAgEFADA...",
  "ledger": {
    "day": "2026-10-14",
    "status": "pending",
    "block_height": 905123,
    "digest": "fb1877ee8cb63b394ddd8a47987bb9c384f5d8ca97353e2248df2ca663db6dd3",
    "proof": {
      "v": 1,
      "day": "2026-10-05",
      "leaf": {
        "kind": "issued",
        "approval_number": "TNB-2026-000123",
        "manifest_sha256": "878a9b0a8452700baaab5574e39716d67a93a07597baab30823639c69bf1e889",
        "signed_at": "2026-10-05T06:20:31.482913Z",
        "revoked_at": "2026-10-05T09:02:44.100200Z"
      },
      "leaf_sha256": "3a6e9c0cc1490e884c3b4a9c6bfd39e19d928a0838407cd48b6317ebcc2ed825",
      "index": 3,
      "leaf_count": 14,
      "path": [
        {
          "side": "left",
          "hash": "e6e9ae1d34d7966232cd03927b9cf18c6d1e1c9532cde816ca929ed482e27326"
        }
      ],
      "merkle_root": "53f8fe42a83fc01075e856d385cea164e06b7124d4c76b3a498e39de98d7168b",
      "anchor_sha256": "e9f1bb3a2238f73741a8245a599da12c813c8c84ccee623aa5c68c71845db4c4",
      "digest": "44eeee2dfc054adad906be43d8d227a8052c19e5080b0ed64dc572fad9ee8f46"
    }
  }
}

application/pkcs7-signature

Errors

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

StatusMeaning
404Nothing there, or not visible to the caller.
429Rate limit; see Retry-After.

Code samples

curl

curl 'https://verify.tanba-ooh.kz/v1/stats-seals/2026-10-13'
Python
import requests

response = requests.get(
    "https://verify.tanba-ooh.kz/v1/stats-seals/2026-10-13",
)
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/stats-seals/2026-10-13", 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))
}