Проверка одного согласования
GET /v1/approval/{number}
https://verify.tanba-ooh.kz/v1/approval/{number}
Один и тот же ответ на неизвестный номер, номер неправильного формата, номер заявки и отклоненную заявку. С Accept: application/json приходит JSON, при любом другом значении HTML-страница.
Аутентификация
Не требуется. Вызов открытый.
Параметры
| Имя | Где | Тип | Обязательный | Описание | Пример |
|---|---|---|---|---|---|
number | путь | string | да | Номер согласования. | TNB-2026-000123 |
p | запрос | string | нет | Токен присутствия из QR-кода плеера, который хранит ключ. Действительный токен добавляет один отсчет присутствия этого плеера; ответ одинаков с токеном, без токена и с неверным токеном. | m2oTq0cFk1gAAl3x-9Q |
Ответы
200 Согласование и его подписанный манифест.
application/json
PublicApproval
| Имя | Тип | Обязательный | Описание | Пример |
|---|---|---|---|---|
approval | object | да | Согласование. | |
approval.number | string | да | Номер согласования. | "TNB-2026-000123" |
approval.status | string | да | Состояние согласования. | "active" |
approval.ledger | array of object | Где согласование и его отзыв записаны в публичном реестре; пусто, пока день не закрыт. | ||
approval.ledger[].kind | string | да | Фиксирует ли запись выдачу или отзыв. issued, revoked | |
approval.ledger[].day | string (date) | да | День записи реестра, Asia/Almaty. | "2026-10-06" |
approval.ledger[].status | string | да | Насколько день заякорен в Биткоине. pending, pending_check, anchored | |
approval.ledger[].block_height | integer | Номер блока Биткоина с аттестацией; есть, когда день заякорен. | 905432 | |
approval.ledger[].proof_url | string | да | Адрес доказательства включения для этой записи. | "/v1/approval/TNB-2026-000123/ledger-proof" |
manifest | object | да | Подписанный манифест с замаскированным номером рекламодателя. | |
manifest_masked | boolean | Всегда true: номер рекламодателя в manifest замаскирован, поэтому это не подписанные байты. | true | |
manifest_sha256 | string | SHA-256 в hex исходных подписанных байтов манифеста до маскирования. | "878a9b0a8452700baaab5574e39716d67a93a07597baab30823639c69bf1e889" |
Пример
{
"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 Не изменялось (ETag).
Без тела.
Ошибки
Ошибки приходят документом problem (application/problem+json) со стабильным полем code.
| Статус | Значение |
|---|---|
| 404 | Не выданное согласование. |
| 429 | Превышен предел частоты; см. Retry-After. |
Примеры кода
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))
}