TAŇBA-OOH Developers

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

NameInTypeRequiredDescriptionExample
fromquerystringyesStart of the range, a date or an RFC 3339 instant.2026-10-06
toquerystringyesEnd of the range, exclusive.2026-10-07

Responses

200 One line for each claim line in the range.

application/json

NameTypeRequiredDescriptionExample
fromstringyesStart of the range."2026-10-06T00:00:00+05:00"
tostringyesEnd of the range."2026-10-07T00:00:00+05:00"
summaryobjectyesTotals over the lines.
summary.linesintegerNumber of claim lines in the range.2
summary.matchedintegerLines whose claim is fully proved.1
summary.over_claimedintegerLines proved in part.1
summary.unmatchedintegerLines with nothing proved.0
summary.claimedintegerPlays claimed over all lines.238
summary.verifiedintegerPlays proved over all lines, each line capped at its claim.230
linesarray of objectyesThe claim lines in time order.
lines[].structure_codestringyesCode of the structure."ALM-0012"
lines[].approval_numberstringyesNumber of the approval of the line."TNB-2026-000123"
lines[].hourstringyesThe hour of the line in Asia/Almaty time."2026-10-06T14:00:00+05:00"
lines[].deal_idstringyesEmpty when the line names no deal."deal-4411"
lines[].claimedintegeryesPlays claimed for the hour.118
lines[].verifiedintegeryesThe smaller of the claim and the plays proved.110
lines[].statusstringyesmatched when all of the claim is proved, over_claimed when part, unmatched when none. matched, over_claimed, unmatched
lines[].untaggedbooleanyesTrue when no tag of the platform backs the line and all untagged plays of the hour were counted.false
lines[].basis_tierstring | nullyesEvidence tier of the proved plays; null when none. mtls, signed, attested, native, <nil>
lines[].tiersobjectyesProved 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.

StatusMeaning
401No valid session or API key (unauthenticated, session_expired, invalid_api_key).
403The role or the key's scope does not allow this (forbidden, key_scope_denied, key_route_denied).
422Field errors (validation_failed).
defaultAn 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))
}