Новейший список отзыва для устройств
GET /d/v1/revocations/latest
https://devices.tanba-ooh.kz/d/v1/revocations/latest
Тот же список, что отдает публичная проверка, на адресе канала устройств. Вызов открытый, сертификат не нужен: плеер, которому ответили device_unauthorized, читает список сам. По умолчанию это подписанный файл PKCS#7 (CMS) с вложенным списком, при format=json тело и подпись в JSON.
Аутентификация
Не требуется. Вызов открытый.
Параметры
| Имя | Где | Тип | Обязательный | Описание | Пример |
|---|---|---|---|---|---|
format | запрос | string | нет | Укажите json, чтобы получить JSON вместо подписанного файла. json | json |
Ответы
200 Список.
application/pkcs7-signature
application/json
RevocationList
| Имя | Тип | Обязательный | Описание | Пример |
|---|---|---|---|---|
version | integer | да | Версия списка; растет с каждым новым списком. | 118 |
issued_at | string | да | Когда выпущен список. | "2026-10-06T08:00:00+05:00" |
not_after | string | да | К этому времени список нужно заменить. | "2026-10-07T08:00:00+05:00" |
body | object | Сам список: отозванные к этому времени согласования и устройства. | ||
body.v | integer | Версия формата тела; остается 1. | 1 | |
body.env | string | Среда, которой принадлежит список. test, prod | ||
body.version | integer | Версия списка. | 42 | |
body.issued_at | string (date-time) | Когда выпущен список. | "2026-10-06T08:00:00+05:00" | |
body.not_after | string (date-time) | К этому времени список нужно заменить. | "2026-10-07T08:00:00+05:00" | |
body.revoked | array of object | Отозванные к этому времени согласования. | ||
body.revoked[].approval_number | string | Номер отозванного согласования. | "TNB-2026-000123" | |
body.revoked[].revoked_at | string (date-time) | Когда согласование отозвано. | "2026-10-05T14:30:00+05:00" | |
body.revoked[].ground_code | string | Код правового основания отзыва, например court_order, noncompliant_content, structure_dismantled или applicant_request. | "court_order" | |
body.revoked_devices | array of object | Отозванные к этому времени устройства; список без этого поля означает, что таких нет. Запись канала сертификата называет серийный номер сертификата (десятичный), запись подписанного канала SHA-256 от открытого ключа в DER. | ||
body.revoked_devices[].device_id | string (uuid) | Отозванное устройство. | "5c0e8f3a-71d2-4b6e-9a14-d8e2f7b30c59" | |
body.revoked_devices[].cert_serial | string | Серийный номер отозванного сертификата, десятичный; канал сертификата. | "1234567890123" | |
body.revoked_devices[].pubkey_sha256 | string | SHA-256 от открытого ключа в DER, hex; подписанный канал. | "ab12c4d7e9f0a1b2c3d4e5f60718293a4b5c6d7e8f90a1b2c3d4e5f607182930" | |
body.revoked_devices[].revoked_at | string (date-time) | Когда устройство отозвано. | "2026-10-05T14:30:00+05:00" | |
signature | string | Base64 от подписи над телом. | "MIIBpQYJKoZIhvcNAQcCoIIBljCCAZICAQExDzANBglghkgBZQMEAgEFADALBgkqhkiG9w0BBwE=" |
Пример
{
"version": 118,
"issued_at": "2026-10-06T08:00:00+05:00",
"not_after": "2026-10-07T08:00:00+05:00",
"body": {
"v": 1,
"env": "prod",
"version": 42,
"issued_at": "2026-10-06T08:00:00+05:00",
"not_after": "2026-10-07T08:00:00+05:00",
"revoked": [
{
"approval_number": "TNB-2026-000123",
"revoked_at": "2026-10-05T14:30:00+05:00",
"ground_code": "court_order"
}
],
"revoked_devices": [
{
"device_id": "5c0e8f3a-71d2-4b6e-9a14-d8e2f7b30c59",
"cert_serial": "1234567890123",
"pubkey_sha256": "ab12c4d7e9f0a1b2c3d4e5f60718293a4b5c6d7e8f90a1b2c3d4e5f607182930",
"revoked_at": "2026-10-05T14:30:00+05:00"
}
]
},
"signature": "MIIBpQYJKoZIhvcNAQcCoIIBljCCAZICAQExDzANBglghkgBZQMEAgEFADALBgkqhkiG9w0BBwE="
}
Ошибки
Ошибки приходят документом problem (application/problem+json) со стабильным полем code.
| Статус | Значение |
|---|---|
| 503 | Пока недоступно. |
| default | Ошибка в виде документа problem. |
Примеры кода
curl
curl 'https://devices.tanba-ooh.kz/d/v1/revocations/latest'
Python
import requests
response = requests.get(
"https://devices.tanba-ooh.kz/d/v1/revocations/latest",
)
print(response.status_code, response.text)
Go
package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, err := http.NewRequest("GET", "https://devices.tanba-ooh.kz/d/v1/revocations/latest", 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))
}