Send a draft for review
POST /api/v1/submissions/{id}/submit
https://app.tanba-ooh.kz/api/v1/submissions/{id}/submit
Scope write:submissions. The draft needs its advertiser, period, product category and media file. A fast-track submission gets its review_due_at here. Moderation and approval stay with the authority; follow the result through the submission.status_changed and approval.issued webhooks.
Authentication
API key in the Authorization header, or a console session.
Scope: write:submissions
Parameters
| Name | In | Type | Required | Description | Example |
|---|---|---|---|---|---|
id | path | string (uuid) | yes | Id of the draft. | 6f1c0d3e-52a4-4b57-9a7e-0c3a1b9d2e44 |
Responses
200 The submission, now in state `submitted`.
application/json
Submission
| Name | Type | Required | Description | Example |
|---|---|---|---|---|
id | string (uuid) | yes | Identifier of the submission. | "6f1c0d3e-52a4-4b57-9a7e-0c3a1b9d2e44" |
number | string | yes | Number of the submission. | "SUB-2026-000087" |
state | string | yes | Current state of the submission. | "draft" |
advertiser_name | string | yes | Name of the advertiser. | "Example Advertising LLP" |
period_from | string | null | yes | First day of the campaign; null if not set yet. | "2026-11-01" |
period_to | string | null | yes | Last day of the campaign; null if not set yet. | "2026-11-30" |
declared_daily_plays | object | Plays per day declared for each structure, keyed by structure identifier. | ||
category_id | integer | null | Advertiser product category, an id from GET /api/v1/categories (IAB Ad Product Taxonomy 2.0, tiers 1 and 2). Required to send a new submission for review; null on submissions that were already in review when categories were introduced. | 1004 | |
category | oneOf | The category with its names in the three console languages, or null when none is set. | ||
channel | string | Where the creative comes from. direct, programmatic | ||
fast_track | boolean | Whether the submission asked for the priority queue. | true | |
external_refs | object | Identifiers of the exchange partner that submitted the creative. Unknown keys are refused. Only with channel programmatic. | ||
external_refs.crid | string | Creative id in the partner's system. | "cr-4711" | |
external_refs.adomain | array of string | Domains of the advertiser, as in OpenRTB adomain. | ["example.com"] | |
external_refs.dsp | string | Identifier of the demand-side platform. | "dsp-one" | |
external_refs.ssp | string | Identifier of the supply-side platform. | "ssp-one" | |
review_due_at | string | null | Deadline of a fast-track review in Almaty time, counted in working hours; null without fast-track or before the submission is sent. | "2026-10-19T11:00:00+05:00" |
Example
{
"id": "6f1c0d3e-52a4-4b57-9a7e-0c3a1b9d2e44",
"number": "SUB-2026-000087",
"state": "draft",
"advertiser_name": "Example Advertising LLP",
"period_from": "2026-11-01",
"period_to": "2026-11-30",
"declared_daily_plays": {},
"category_id": 1004,
"category": {
"id": 1004,
"parent_id": 1002,
"tier": 2,
"name": {
"en": "Beer",
"ru": "Пиво",
"kk": "Сыра"
}
},
"channel": "programmatic",
"fast_track": true,
"external_refs": {
"crid": "cr-4711",
"adomain": [
"example.com"
],
"dsp": "dsp-one",
"ssp": "ssp-one"
},
"review_due_at": "2026-10-19T11:00:00+05:00"
}
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. |
| 409 | An error as a problem document. |
| 422 | Field errors (validation_failed). |
| default | An error as a problem document. |
Code samples
curl
curl -X POST 'https://app.tanba-ooh.kz/api/v1/submissions/6f1c0d3e-52a4-4b57-9a7e-0c3a1b9d2e44/submit' \
-H 'Authorization: Bearer YOUR_API_KEY'
Python
import requests
response = requests.post(
"https://app.tanba-ooh.kz/api/v1/submissions/6f1c0d3e-52a4-4b57-9a7e-0c3a1b9d2e44/submit",
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("POST", "https://app.tanba-ooh.kz/api/v1/submissions/6f1c0d3e-52a4-4b57-9a7e-0c3a1b9d2e44/submit", 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))
}