Evidence pack of a structure and a period
GET /api/v1/stats/evidence.zip
https://app.tanba-ooh.kz/api/v1/stats/evidence.zip
Scope read:stats. Own organisation; the authority sees all. The batches that added plays to the structure in the days asked for, with their keys and daily seals, without bill lines. At most 31 days. Same pack format, rules and audit as the evidence pack of a bill line.
Authentication
API key in the Authorization header, or a console session.
Scope: read:stats
Parameters
| Name | In | Type | Required | Description | Example |
|---|---|---|---|---|---|
structure | query | string | yes | Code of the structure. | S-001 |
from | query | string (date) | yes | First day, Almaty calendar. | 2026-10-01 |
to | query | string (date) | yes | Last day, Almaty calendar, at most 30 days after from. | 2026-10-31 |
format | query | string | no | Set to zip to download the pack instead of reading its summary. zip | zip |
Responses
200 The summary, or the pack as a zip file.
application/json
EvidenceSummary
| Name | Type | Required | Description | Example |
|---|---|---|---|---|
kind | string | yes | What the pack is about. accrual, statement, window, dispute | |
key | string | yes | Stable name of the subject; a new version of a pack keeps it. | "accrual:4711" |
stored_version | integer | null | yes | Version of the stored pack with exactly this content, or null when the next download will create it. | 1 |
stored_pack_id | string | null (uuid) | yes | Identifier of that stored pack, or null. | "7d1f0e5a-2b9c-4c63-8a4d-5e0f6b3c9a12" |
batches | integer | yes | Telemetry batches in the pack. | 2 |
plays | integer (int64) | yes | Plays those batches added in the hours the pack covers. | 9 |
seals | integer | yes | Daily seals in the pack. | 1 |
batches_sealed | integer | yes | Batches whose receive day is sealed. | 2 |
lines | array of object | yes | The bill lines the pack explains; empty for a structure period. | |
lines[].accrual_id | integer (int64) | yes | Identifier of the bill line. | 4711 |
lines[].source_ref | string | yes | Structure and hours of the line. | "S-001 2026-10-05T10..2026-10-20T11" |
lines[].structure | string | yes | Structure code. | "S-001" |
lines[].plays | integer (int64) | yes | Plays billed on the line. | 3739 |
lines[].units | string | yes | Billing units with three decimals. | "3739.000" |
lines[].amount_kzt | string | yes | Line amount in tenge, without VAT. | "1869.50" |
lines[].trueup | boolean | yes | True for a line that bills late plays of an earlier month; it is not recomputed from its own hours. | false |
lines[].partial | string | yes | Why the batches behind the line cannot all be recounted; empty when they can. | "" |
partial | array of string | yes | What cannot be fully recounted, in words; empty for a complete pack. | [] |
manifest_sha256 | string | yes | SHA-256 of the manifest in hex. | "9f2c1b7a4e6d8053a1c2b3d4e5f60718293a4b5c6d7e8f90a1b2c3d4e5f60718" |
download | string | yes | Address that downloads the pack. | "/api/v1/billing/accruals/4711/evidence?format=zip" |
count_rule | string | yes | Version of the counting rule the pack was made with. | "tanba.count/1" |
Example
{
"kind": "accrual",
"key": "accrual:4711",
"stored_version": 1,
"stored_pack_id": "7d1f0e5a-2b9c-4c63-8a4d-5e0f6b3c9a12",
"batches": 2,
"plays": 9,
"seals": 1,
"batches_sealed": 2,
"lines": [
{
"accrual_id": 4711,
"source_ref": "S-001 2026-10-05T10..2026-10-20T11",
"structure": "S-001",
"plays": 3739,
"units": "3739.000",
"amount_kzt": "1869.50",
"trueup": false,
"partial": ""
}
],
"partial": [],
"manifest_sha256": "9f2c1b7a4e6d8053a1c2b3d4e5f60718293a4b5c6d7e8f90a1b2c3d4e5f60718",
"download": "/api/v1/billing/accruals/4711/evidence?format=zip",
"count_rule": "tanba.count/1"
}
application/zip
Errors
Errors are problem documents (application/problem+json) with a stable code.
| Status | Meaning |
|---|---|
| 401 | No valid session or API key (unauthenticated, session_expired, invalid_api_key). |
| 403 | The role or the key's scope does not allow this (forbidden, key_scope_denied, key_route_denied). |
| 404 | Nothing there, or not visible to the caller. |
| 422 | Field errors (validation_failed). |
| 503 | The signing service is not available. |
| default | An error as a problem document. |
Code samples
curl
curl 'https://app.tanba-ooh.kz/api/v1/stats/evidence.zip?structure=S-001&from=2026-10-01&to=2026-10-31' \
-H 'Authorization: Bearer YOUR_API_KEY'
Python
import requests
response = requests.get(
"https://app.tanba-ooh.kz/api/v1/stats/evidence.zip?structure=S-001&from=2026-10-01&to=2026-10-31",
headers={
"Authorization": "Bearer YOUR_API_KEY",
},
)
print(response.status_code, response.text)
Go
package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, err := http.NewRequest("GET", "https://app.tanba-ooh.kz/api/v1/stats/evidence.zip?structure=S-001&from=2026-10-01&to=2026-10-31", nil)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
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))
}