TAŇBA-OOH Developers

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

NameInTypeRequiredDescriptionExample
filepathstringyesThe month and the format, such as 2026-08.csv or 2026-08.json.2026-08.csv
If-None-MatchheaderstringnoThe 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

NameTypeRequiredDescriptionExample
monthstringyesThe month the figures cover, YYYY-MM."2026-08"
basisstringyesThe trust tier of the counted plays."mtls"
licenceobjectyesThe licence note of the files. The terms of use are the city's decision; until it is made the note says so.
licence.statusstringyesdraft until the city decides. draft
licence.textobjectyesThe note in English, Russian and Kazakh.
licence.text.enstringyesEnglish text."Draft - pending the city's decision."
licence.text.rustringyesRussian text."Проект - ожидает решения города."
licence.text.kkstringyesKazakh text."Жоба - қаланың шешімін күтуде."
disclosureobjectyesThe thresholds the release was built with.
disclosure.min_operatorsintegeryesOperators a published cell needs.3
disclosure.min_advertisersintegeryesAdvertisers a published cell needs.3
disclosure.max_party_share_pctintegeryesThe most percent of a cell's plays one operator or one advertiser may hold.70
disclosure.lag_monthsintegeryesFull months between the end of a month and its release.1
cityobjectyesThe total of the whole city.
city.statusstringyeswithheld when the total would reveal a blank cell. published, withheld
city.playsintegerPlays in the month; present when published.1280450
city.on_screen_hoursnumberHours on screen in the month; present when published.3556.79
city.screensintegerScreens that played in the month; present when published.312
tablesarray of objectyesThe two tables of cells.
tables[].namestringyesName of the table."district_format"
tables[].rowsstringyesWhat the rows are."district"
tables[].colsstringyesWhat the columns are."format"
tables[].cellsarray of objectyesThe cells in the order of row, then column.
tables[].cells[].rowstringyesRow code."medeu"
tables[].cells[].colstringyesColumn code."cityboard"
tables[].cells[].statusstringyessuppressed cells are blank on purpose. published, suppressed
tables[].cells[].playsinteger | nullyesPlays in the month; null unless published.84210
tables[].cells[].on_screen_hoursnumber | nullyesHours 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.

StatusMeaning
404Open data is switched off (not_published), or the month or file is not published or does not exist (not_found).
429Rate 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))
}