TAŇBA-OOH Developers

Check one approval

GET /v1/approval/{number}

https://verify.tanba-ooh.kz/v1/approval/{number}

The same answer for an unknown number, a malformed number, a submission number and a rejected submission. Send Accept of application/json for JSON, anything else gets the HTML page.

Authentication

None. This call is public.

Parameters

NameInTypeRequiredDescriptionExample
numberpathstringyesApproval number.TNB-2026-000123
pquerystringnoPresence token printed in the QR code of a player that holds the key. A valid token adds one count to the presence of that player; the answer is the same with, without or with a wrong token.m2oTq0cFk1gAAl3x-9Q

Responses

200 The approval and its signed manifest.

application/json

PublicApproval

NameTypeRequiredDescriptionExample
approvalobjectyesThe approval.
approval.numberstringyesApproval number."TNB-2026-000123"
approval.statusstringyesState of the approval."active"
approval.ledgerarray of objectWhere the approval and its revocation are recorded in the public ledger; empty until the day is closed.
approval.ledger[].kindstringyesWhether the entry records the issue or the revocation. issued, revoked
approval.ledger[].daystring (date)yesDay of the ledger entry, Asia/Almaty."2026-10-06"
approval.ledger[].statusstringyesHow far the day has been anchored in Bitcoin. pending, pending_check, anchored
approval.ledger[].block_heightintegerNumber of the Bitcoin block that holds the attestation; present once the day is anchored.905432
approval.ledger[].proof_urlstringyesAddress of the inclusion proof for this entry."/v1/approval/TNB-2026-000123/ledger-proof"
manifestobjectyesThe signed manifest with the advertiser's number masked.
manifest_maskedbooleanAlways true: the advertiser's number in manifest is masked, so it is not the signed bytes.true
manifest_sha256stringHex SHA-256 of the original signed manifest bytes, before masking."878a9b0a8452700baaab5574e39716d67a93a07597baab30823639c69bf1e889"

Example

{
  "approval": {
    "number": "TNB-2026-000123",
    "status": "active",
    "ledger": [
      {
        "kind": "issued",
        "day": "2026-10-06",
        "status": "pending",
        "block_height": 905432,
        "proof_url": "/v1/approval/TNB-2026-000123/ledger-proof"
      }
    ]
  },
  "manifest": {},
  "manifest_masked": true,
  "manifest_sha256": "878a9b0a8452700baaab5574e39716d67a93a07597baab30823639c69bf1e889"
}

text/html

304 Not modified (ETag).

No body.

Errors

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

StatusMeaning
404Not an issued approval.
429Rate limit; see Retry-After.

Code samples

curl

curl 'https://verify.tanba-ooh.kz/v1/approval/TNB-2026-000123' \
  -H 'Accept: application/json'
Python
import requests

response = requests.get(
    "https://verify.tanba-ooh.kz/v1/approval/TNB-2026-000123",
    headers={
        "Accept": "application/json",
    },
)
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/approval/TNB-2026-000123", nil)
	if err != nil {
		panic(err)
	}
	req.Header.Set("Accept", "application/json")
	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))
}