One open data file (served at /open/{file} on the verify host)
GET /v1/open/{file}
https://verify.tanba-ooh.kz/v1/open/{file}
A file of a published release, YYYY-MM.csv or YYYY-MM.json. The bytes are the ones whose hash the public ledger carries; they are never recomputed. The header X-Data-Licence carries the licence note (a draft for now). A month that is not published, and any other name, answer 404.
Authentication
None. This call is public.
Parameters
| Name | In | Type | Required | Description | Example |
|---|---|---|---|---|---|
file | path | string | yes | The month and the format, such as 2026-08.csv or 2026-08.json. | 2026-08.csv |
If-None-Match | header | string | no | The ETag of a copy you already hold; the answer is then 304 without a body. | "3f786850e387550fdab836ed7e6dc881de23001b3f786850e387550fdab836ed" |
Responses
200 The file.
text/csv
Example
string
application/json
OpenDataFile
| Name | Type | Required | Description | Example |
|---|---|---|---|---|
month | string | yes | The month the figures cover, YYYY-MM. | "2026-08" |
basis | string | yes | The trust tier of the counted plays. | "mtls" |
licence | object | yes | The licence note of the files. The terms of use are the city's decision; until it is made the note says so. | |
licence.status | string | yes | draft until the city decides. draft | |
licence.text | object | yes | The note in English, Russian and Kazakh. | |
licence.text.en | string | yes | English text. | "Draft - pending the city's decision." |
licence.text.ru | string | yes | Russian text. | "Проект - ожидает решения города." |
licence.text.kk | string | yes | Kazakh text. | "Жоба - қаланың шешімін күтуде." |
disclosure | object | yes | The thresholds the release was built with. | |
disclosure.min_operators | integer | yes | Operators a published cell needs. | 3 |
disclosure.min_advertisers | integer | yes | Advertisers a published cell needs. | 3 |
disclosure.max_party_share_pct | integer | yes | The most percent of a cell's plays one operator or one advertiser may hold. | 70 |
disclosure.lag_months | integer | yes | Full months between the end of a month and its release. | 1 |
city | object | yes | The total of the whole city. | |
city.status | string | yes | withheld when the total would reveal a blank cell. published, withheld | |
city.plays | integer | Plays in the month; present when published. | 1280450 | |
city.on_screen_hours | number | Hours on screen in the month; present when published. | 3556.79 | |
city.screens | integer | Screens that played in the month; present when published. | 312 | |
tables | array of object | yes | The two tables of cells. | |
tables[].name | string | yes | Name of the table. | "district_format" |
tables[].rows | string | yes | What the rows are. | "district" |
tables[].cols | string | yes | What the columns are. | "format" |
tables[].cells | array of object | yes | The cells in the order of row, then column. | |
tables[].cells[].row | string | yes | Row code. | "medeu" |
tables[].cells[].col | string | yes | Column code. | "cityboard" |
tables[].cells[].status | string | yes | suppressed cells are blank on purpose. published, suppressed | |
tables[].cells[].plays | integer | null | yes | Plays in the month; null unless published. | 84210 |
tables[].cells[].on_screen_hours | number | null | yes | Hours on screen in the month; null unless published. | 233.92 |
Example
{
"month": "2026-08",
"basis": "mtls",
"licence": {
"status": "draft",
"text": {
"en": "Draft - pending the city's decision.",
"ru": "Проект - ожидает решения города.",
"kk": "Жоба - қаланың шешімін күтуде."
}
},
"disclosure": {
"min_operators": 3,
"min_advertisers": 3,
"max_party_share_pct": 70,
"lag_months": 1
},
"city": {
"status": "published",
"plays": 1280450,
"on_screen_hours": 3556.79,
"screens": 312
},
"tables": [
{
"name": "district_format",
"rows": "district",
"cols": "format",
"cells": [
{
"row": "medeu",
"col": "cityboard",
"status": "published",
"plays": 84210,
"on_screen_hours": 233.92
}
]
}
]
}
304 The copy you hold is current.
No body.
Errors
Errors are problem documents (application/problem+json) with a stable code.
| Status | Meaning |
|---|---|
| 404 | Open data is switched off (not_published), or the month or file is not published or does not exist (not_found). |
| 429 | Rate limit; see Retry-After. |
Code samples
curl
curl 'https://verify.tanba-ooh.kz/v1/open/2026-08.csv'
Python
import requests
response = requests.get(
"https://verify.tanba-ooh.kz/v1/open/2026-08.csv",
)
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/open/2026-08.csv", 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))
}