Check what the exchange claimed against the plays the players proved
GET /api/v1/plays/claims/verification
https://app.tanba-ooh.kz/api/v1/plays/claims/verification
Scope write:plays (the same key that submits claims). Administrators and staff of an ad platform.
For every claim line of the organisation in the range, returns how many plays the players proved and a status: matched (all that was claimed is proved), over_claimed (less than claimed but not nothing), unmatched (nothing proved). verified is the smaller of claimed and proved. Plays proved are those a player tagged with your organisation as the seller (detail.src of the play record) and, when the line names a deal, with that deal. A line with no such tag counts the plays of the hour that no other seller's tag explains, and gets untagged: true. The larger count over the evidence tiers is taken, never their sum; basis_tier names that tier and tiers shows the proved plays by tier. Plays that operators report from their own CMS are no proof and are not read.
A tag is attribution, not proof. A claim never changes billing: the bill follows the plays of the players alone. The range from–to is dates (Asia/Almaty days) or RFC 3339 instants, to exclusive, at most 62 days.
Authentication
API key in the Authorization header, or a console session.
Scope: write:plays
Parameters
| Name | In | Type | Required | Description | Example |
|---|---|---|---|---|---|
from | query | string | yes | Start of the range, a date or an RFC 3339 instant. | 2026-10-06 |
to | query | string | yes | End of the range, exclusive. | 2026-10-07 |
Responses
200 One line for each claim line in the range.
application/json
| Name | Type | Required | Description | Example |
|---|---|---|---|---|
from | string | yes | Start of the range. | "2026-10-06T00:00:00+05:00" |
to | string | yes | End of the range. | "2026-10-07T00:00:00+05:00" |
summary | object | yes | Totals over the lines. | |
summary.lines | integer | Number of claim lines in the range. | 2 | |
summary.matched | integer | Lines whose claim is fully proved. | 1 | |
summary.over_claimed | integer | Lines proved in part. | 1 | |
summary.unmatched | integer | Lines with nothing proved. | 0 | |
summary.claimed | integer | Plays claimed over all lines. | 238 | |
summary.verified | integer | Plays proved over all lines, each line capped at its claim. | 230 | |
lines | array of object | yes | The claim lines in time order. | |
lines[].structure_code | string | yes | Code of the structure. | "ALM-0012" |
lines[].approval_number | string | yes | Number of the approval of the line. | "TNB-2026-000123" |
lines[].hour | string | yes | The hour of the line in Asia/Almaty time. | "2026-10-06T14:00:00+05:00" |
lines[].deal_id | string | yes | Empty when the line names no deal. | "deal-4411" |
lines[].claimed | integer | yes | Plays claimed for the hour. | 118 |
lines[].verified | integer | yes | The smaller of the claim and the plays proved. | 110 |
lines[].status | string | yes | matched when all of the claim is proved, over_claimed when part, unmatched when none. matched, over_claimed, unmatched | |
lines[].untagged | boolean | yes | True when no tag of the platform backs the line and all untagged plays of the hour were counted. | false |
lines[].basis_tier | string | null | yes | Evidence tier of the proved plays; null when none. mtls, signed, attested, native, <nil> | |
lines[].tiers | object | yes | Proved plays by evidence tier. | {"mtls": 110} |
Example
{
"from": "2026-10-06T00:00:00+05:00",
"to": "2026-10-07T00:00:00+05:00",
"summary": {
"lines": 2,
"matched": 1,
"over_claimed": 1,
"unmatched": 0,
"claimed": 238,
"verified": 230
},
"lines": [
{
"structure_code": "ALM-0012",
"approval_number": "TNB-2026-000123",
"hour": "2026-10-06T14:00:00+05:00",
"deal_id": "deal-4411",
"claimed": 118,
"verified": 110,
"status": "over_claimed",
"untagged": false,
"basis_tier": "mtls",
"tiers": {
"mtls": 110
}
}
]
}
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). |
| 422 | Field errors (validation_failed). |
| default | An error as a problem document. |
Code samples
curl
curl 'https://app.tanba-ooh.kz/api/v1/plays/claims/verification?from=2026-10-06&to=2026-10-07' \
-H 'Authorization: Bearer YOUR_API_KEY'
Python
import requests
response = requests.get(
"https://app.tanba-ooh.kz/api/v1/plays/claims/verification?from=2026-10-06&to=2026-10-07",
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/plays/claims/verification?from=2026-10-06&to=2026-10-07", 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))
}