API за свързване с вашата система
Въведение и ориентация
Как да управлявате медийни файлове, кампании и отчети директно от вашата система, без да влизате в администрацията.
За какво служи API
API позволява системата на клиента — например онлайн магазин, планировчик на рекламни кампании или вътрешен каталог — да се свърже директно с управлението на съдържанието на устройствата. Вашата система може да качва медийни файлове, да създава и стартира кампании и да получава резултатите им, без някой да трябва да влиза в администрацията и да извършва тези действия ръчно.
Интерфейсът е същият, който използва уеб администрацията. Затова чрез API могат да се извършват същите действия като в администрацията, в обхвата на правата на влезлия потребител.
Кога да използвате API
За епизодично качване на няколко медийни файла и ръчно стартиране на кампания администрацията е по-подходяща: съветникът за кампании показва преглед и проверява формата на файловете и капацитета на устройствата. API има смисъл, когато ръчната работа започне да ви забавя.
| Трябва да | Препоръчан начин |
|---|---|
| Качите няколко медийни файла и стартирате кампания | Администрация |
| Сменяте съдържанието редовно, но ръчно | Администрация |
| Качвате масово медийни файлове от собствената си система | API |
| Създавате кампании автоматично според собствен планировчик | API |
| Прехвърляте резултатите от кампаниите в собствената си отчетност | API |
Интерфейсът не е версиониран и може да се променя с развитието на платформата. Преди внедряване уведомете Вашия доставчик на софтуер за интеграцията и след актуализации на системата проверете дали тя продължава да работи.
За кого е ръководството и кой за какво отговаря
- Доставчикът на платформата поддържа интерфейса, съобщава адреса на администрацията и задава режима на възпроизвеждане на Фирмата.
- Клиентът решава за обхвата на интеграцията и създава във своята Фирма отделен потребител с необходимите права — вижте Създаване на потребител и първо влизане.
- Разработчикът на интеграцията свързва системата на клиента с интерфейса. Техническите указания и примерите с код в това ръководство са предназначени за него. Ако сами разработвате интеграцията, изпълнявате и тази роля.
Техническа справка
Техническо ръководство за разработчици на интеграции
Първо се запознайте с общите правила за извикване и с влизането. След това преминете през процедурата от качването на медиен файл до стартирането на кампания и прегледа на наличните адреси.
Общи правила за извикване
- Адрес: интерфейсът работи на същия адрес като вашата администрация; всички пътища започват с
/api/. В примерите адресът е заменен сhttps://admin.example.org. Ако има тестова среда, доставчикът ще ви съобщи адреса ѝ. - Вход: всяка заявка носи данните за вход чрез HTTP Basic Auth. Не се използват сесии или токени.
- Формат на данните: телата на заявките и отговорите са във формат JSON. Изключение е качването на файл, чието тяло съдържа самите двоични данни.
- Идентификатори и стойности: идентификаторите са цели числа. Датата и часът се записват във формат
ГГГГ-ММ-ДДTЧЧ:ММ:СС, продължителността на показване — в милисекунди (10000= 10 s). - Резултат: успехът се потвърждава с код
200. Той означава, че заявката е приета, а не че съдържанието вече се възпроизвежда на устройствата.
Вход
Потребителското име не е имейл адрес, а осемзнаков код, генериран от системата при създаването на потребителя, например A1B2C3D4. За интеграцията създайте отделен потребител с минимално необходимите права; достъпът му може да бъде премахнат по всяко време, без това да засегне другите потребители.
curl -u "A1B2C3D4:vashata-parola" https://admin.example.org/api/public/loginПаролата се изпраща с всяка заявка. Съхранявайте я като тайна, например в променлива на средата или в трезор за пароли — никога в изходния код, хранилището или журналите.
Примерите по-долу предполагат зададени променливи:
export API="https://admin.example.org"
export AUTH="A1B2C3D4:vashata-parola"Примерите използват инструмента curl, защото не зависи от езика за програмиране. Интерфейсът е обикновен HTTP, затова може да се извиква от всеки език или инструмент с поддръжка на Basic Auth, например Python, JavaScript, PHP, Postman или Make.
Процедура: от файл до стартирана кампания
- Получете идентификатора на Фирмата. Ще го използвате във всички следващи извиквания.
- Качете медиен файл. Отговорът връща неговия идентификатор.
- Заредете шаблон на кампания. Сървърът го попълва предварително с настройките на Фирмата и списъка с локации и устройства.
- Редактирайте шаблона — име, период, целеви устройства и визуален материал.
- Създайте кампанията. Тя се създава като чернова и все още не се възпроизвежда.
- Активирайте кампанията. Системата подготвя нов план за възпроизвеждане и го изпраща към устройствата.
- Следете резултатите в отчета за кампанията.
1. Идентификатор на Фирмата
curl -u "$AUTH" "$API/api/public/login"Отговор (съкратен):
{
"id": 1715714421868,
"name": "Интеграция – онлайн магазин",
"login": "A1B2C3D4",
"company": { "id": 1698234512001, "name": "Рекламна агенция ООД" },
"permission": {
"resource": 12,
"device_layer_top": 12,
"report_layer_top": 4
}
}Запазете стойността на company.id; в примерите тя се използва като променливата COMPANY. Разделът permission съдържа правата на потребителя; значението им е описано в частта Права.
2. Качване на медиен файл
Файлът се изпраща като двоично тяло на заявката с метода PUT; свойствата му се задават в заглавките.
curl -u "$AUTH" -X PUT \
"$API/api/resource/single/$COMPANY" \
-H "file-type: IMAGE" \
-H "file-mime: image/jpeg" \
-H "file-name: summer-sale.jpg" \
-H "file-suffix: jpg" \
--data-binary @summer-sale.jpg| Заглавка | Съдържание |
|---|---|
file-type | Вид на медийния файл според таблицата Видове медийни файлове, например IMAGE. |
file-mime | MIME тип на файла, например image/jpeg, video/mp4 или application/pdf. |
file-name | Име на медийния файл в администрацията; евентуалното разширение се премахва от сървъра. Имена с символи извън ASCII кодирайте като URL (encodeURIComponent). |
file-suffix | Разширение на файла без точка. |
Същото извикване на Python:
import requests
with open("summer-sale.jpg", "rb") as f:
r = requests.put(
f"{API}/api/resource/single/{COMPANY}",
auth=("A1B2C3D4", "vashata-parola"),
headers={
"file-type": "IMAGE",
"file-mime": "image/jpeg",
"file-name": "summer-sale.jpg",
"file-suffix": "jpg",
},
data=f,
)
r.raise_for_status()
resource_id = r.json()["id"]Отговорът съдържа идентификатора на медийния файл (id) и неговия вид (type); двете стойности ще използвате във визуалния материал на кампанията.
{
"id": 1724832015443,
"type": 2,
"name": "summer-sale",
"width": 1920,
"height": 1080,
"duration": 0,
"aspectRatio": 32
}- Размер: обикновени файлове до около 1,1 GB, видео с прозрачност до около 2,1 GB. По-голям файл сървърът отхвърля с код
413. - Подготовка на видео: след качване видеото се конвертира във фонов режим. То е готово, когато детайлът на медийния файл (
GET /api/resource/single/{companyId}/{id}) съдържа стойност вdt_ready. При изображенията подготовката е практически мигновена. - Липсваща заглавка: без
file-mime,file-nameилиfile-suffixсървърът връща204и не създава медийния файл. Затова преди следващата стъпка винаги проверявайте дали отговорът съдържаid.
3. Шаблон на кампания
Не съставяйте кампанията ръчно. Поискайте шаблон, който сървърът попълва предварително с период по подразбиране (един месец от днес), настройките на Фирмата и списъка с всички локации и устройства. Всяко устройство в него е отбелязано с isActive: false.
curl -u "$AUTH" "$API/api/campaign/company/$COMPANY" > campaign.jsonПример за шаблон (съкратен):
{
"id": -1,
"groupId": -1,
"state": 2,
"name": "",
"start": "2026-11-01T10:00:00",
"end": "2026-12-01T10:00:00",
"isCommercial": true,
"isNonCommercial": false,
"settings": {
"type": 2,
"companyCount": 10,
"companyDuration": 10000,
"campaignCount": 1,
"campaignDuration": 10000
},
"locations": [
{
"id": 1698234512100,
"name": "Търговски център",
"days": [ { "day": 1, "start": "09:00", "end": "21:00" } ],
"devices": [
{
"id": 1698234512201,
"name": "Вход А",
"screenRatio": 32,
"isHorizontal": true,
"isActive": false
}
]
}
],
"visuals": []
}Стойността на settings.type определя режима на възпроизвеждане на Фирмата: 2 = SLOT, 4 = IMPRESSION. Режимът се задава от доставчика и не може да се променя чрез API.
4. Редактиране на шаблона
name: име на кампанията, показвано в администрацията и отчетите.start,end: начало и край на кампанията.isActive: задайтеtrueза устройствата, на които трябва да се възпроизвежда кампанията.visuals: добавете визуален материал с качения медиен файл.
"visuals": [
{
"id": 1,
"name": "Основен визуален материал",
"isPrimary": true,
"isCustom": true,
"res": [
{
"id": 1,
"conditionId": 0,
"resourceId": 1724832015443,
"name": "summer-sale",
"duration": 10000,
"type": 2
}
]
}
]| Поле | Значение |
|---|---|
id | Произволно число, уникално в рамките на кампанията; сървърът го преномерира при създаването. |
isPrimary | true за основния визуален материал, false за останалите. |
isCustom | true – визуалният материал принадлежи на тази кампания. |
resourceId | Идентификатор на медийния файл от стъпка 2. |
duration | Продължителност на показване в милисекунди. |
type | Вид на медийния файл; същата стойност, която качването върна в полето type. |
Редактирането може да се извърши със скрипт, например с инструмента jq:
jq --argjson res "$RESOURCE" '
.name = "Лятно намаление 2026"
| .start = "2026-11-02T00:00:00"
| .end = "2026-11-09T00:00:00"
| .locations[].devices[].isActive = true
| .visuals = [{
id: 1, name: "Основен визуален материал", isPrimary: true, isCustom: true,
res: [{ id: 1, conditionId: 0, resourceId: $res,
name: "summer-sale", duration: 10000, type: 2 }]
}]
' campaign.json > campaign-edited.jsonАко кампанията е насочена към хоризонтални и вертикални екрани (isHorizontal), добавете визуален материал за всяка ориентация. В противен случай съдържанието ще бъде изрязано или намалено на част от екраните. Подробности ще намерите в ръководството Визуални материали на кампанията.
5. Създаване на кампанията
curl -u "$AUTH" -X POST \
"$API/api/campaign/company/$COMPANY" \
-H "Content-Type: application/json" \
--data @campaign-edited.json \
-o response.json
export CAMPAIGN=$(jq -r '.id' response.json)
export GROUP=$(jq -r '.groupId' response.json)Кампанията се създава в състояние чернова и не се възпроизвежда никъде. Отговорът съдържа запазената кампания с присвоените стойности id и groupId. Шаблонът вече има правилно зададено състояние state: 2 (чернова); друга стойност сървърът отхвърля с код 409.
6. Активиране на кампанията
curl -u "$AUTH" -X PATCH \
"$API/api/campaign/company/$COMPANY/$CAMPAIGN/+02:00/0"+02:00: часовата зона като отместване спрямо UTC, по която се ръководи кампанията. За България+02:00през зимното и+03:00през лятното часово време.0: очакваният брой показвания за цялата кампания. Прилага се в режим IMPRESSION; в режим SLOT посочете0.
Кампания с днешна или по-ранна начална дата преминава в състояние активна и началото ѝ се задава на момента на активирането. Кампания с бъдеща начална дата преминава в състояние публикувана и стартира в планирания ден.
След това системата преизчислява плана за възпроизвеждане и го изпраща към засегнатите устройства. При свързаните устройства това обикновено отнема десетки секунди; несвързано устройство получава плана след възстановяване на връзката. Капацитета на устройствата проверете в администрацията, вижте Капацитет на кампанията.
7. Резултати от кампанията
curl -u "$AUTH" "$API/api/report/$COMPANY/campaign/$GROUP"
curl -u "$AUTH" "$API/api/report/$COMPANY/campaign/$GROUP/impression"Отчетите използват groupId, а не id на кампанията. Първият адрес връща обобщение на кампанията, вторият — броя на регистрираните показвания. Устройствата изпращат записите непрекъснато на пакети, затова данните не са налични в реално време. Значението на данните е описано в Отчет за кампанията.
Пауза, спиране и изтриване
# пауза на активна кампания; повторното извикване я възобновява
curl -u "$AUTH" -X PATCH \
"$API/api/campaign/company/$COMPANY/$CAMPAIGN/+02:00/0"
# окончателно спиране
curl -u "$AUTH" -X PATCH \
"$API/api/campaign/company/$COMPANY/$CAMPAIGN/+02:00"
# изтриване
curl -u "$AUTH" -X DELETE \
"$API/api/campaign/company/$COMPANY/$CAMPAIGN"Адресът от стъпка 6 работи като превключвател: поставя на пауза активна или публикувана кампания и възобновява кампания на пауза. Затова преди извикването проверете текущото състояние на кампанията (state в детайла). Спряна кампания не може да бъде стартирана отново, но остава в списъка заедно с отчетите си. Изтритата кампания изчезва от списъка.
Преглед на адресите
Адресите са относителни спрямо адреса на администрацията. {c} означава идентификатора на Фирмата.
Акаунт
| Метод | Адрес | Какво прави |
|---|---|---|
GET | /api/public/login | Проверява данните за вход и връща профила на потребителя, включително company.id. |
GET | /api/user/info | Информация за влезлия потребител. |
GET | /api/user/check | Бърза проверка на валидността на входа. |
Медийни файлове
| Метод | Адрес | Какво прави |
|---|---|---|
PUT | /api/resource/single/{c} | Качва файл (заглавки file-*, тяло = двоични данни). |
GET | /api/resource/listing/{c}/1 | Списък с медийни файлове; 1 = без ограничение на вида. |
GET | /api/resource/single/{c}/{id} | Детайл на медийния файл. |
DELETE | /api/resource/single/{c}/{id} | Изтрива медийния файл. |
Кампании
| Метод | Адрес | Какво прави |
|---|---|---|
GET | /api/campaign/company/{c} | Шаблон на нова кампания. |
POST | /api/campaign/company/{c} | Създава кампания като чернова. |
PATCH | /api/campaign/company/{c} | Запазва промените в съществуваща кампания. |
POST | /api/campaign/listing/company/{c} | Списък с кампании; тялото на заявката съдържа филтър. |
GET | /api/campaign/company/{c}/{id} | Детайл на кампанията. |
GET | /api/campaign/company/{c}/group/{groupId} | Детайл на кампанията по groupId. |
PATCH | /api/campaign/company/{c}/{id}/{tz}/{impressions} | Активира, поставя на пауза или възобновява кампания. |
PATCH | /api/campaign/company/{c}/{id}/{tz} | Спира кампанията окончателно. |
DELETE | /api/campaign/company/{c}/{id} | Изтрива кампанията. |
Локации и устройства
| Метод | Адрес | Какво прави |
|---|---|---|
GET | /api/location/listing/{c} | Списък с локации. |
GET | /api/location/single/{id} | Детайл на локацията, включително работното време. |
GET | /api/device/listing/{c}/{locationId} | Списък с устройствата в локацията. |
GET | /api/device/single/{id}/{lang} | Детайл на устройството; lang е езиков код, например bg. |
Отчети
| Метод | Адрес | Какво прави |
|---|---|---|
GET | /api/report/{c}/campaign/{groupId} | Обобщение на кампанията. |
GET | /api/report/{c}/campaign/{groupId}/impression | Брой регистрирани показвания. |
Номенклатури
Стойностите на номенклатурите се записват в JSON като числа.
Състояние на кампанията (state)
| Стойност | Състояние | Значение |
|---|---|---|
2 | Чернова | Запазена кампания, която не се възпроизвежда. |
4 | Публикувана | Активирана кампания, която чака началния си ден. |
8 | Активна | Кампанията се възпроизвежда. |
16 | Завършена | Краят на кампанията е изминал. |
32 | Спряна | Кампанията е спряна окончателно. |
64 | Изтрита | Кампанията е изтрита. |
128 | На пауза | Възпроизвеждането е временно прекъснато. |
Видове медийни файлове
Стойност на type | Заглавка file-type | Медиен файл |
|---|---|---|
2 | IMAGE | Изображение (JPG, PNG, WebP) |
4 | VIDEO | Видео |
8 | PDF | PDF документ |
16 | WWW_APP | Уеб приложение |
32 | TEXT | Дълъг текст |
128 | VIDEO_ALPHA | Видео с прозрачен фон |
256 | AUDIO | Аудио |
За документ в заглавката file-type се използва стойността PDF, а не DOCUMENT.
Права
Интерфейсът прилага същите права като администрацията и ги проверява при всяка заявка. В отговора при вход всяка област е изразена с число, което е сбор от отделните права:
| Стойност | Право в собствената Фирма |
|---|---|
4 | Преглед |
8 | Добавяне |
16 | Редактиране |
32 | Изтриване |
Например resource: 28 (4 + 8 + 16) означава, че потребителят може да преглежда, добавя и редактира медийни файлове, но не и да ги изтрива. По-високите стойности (128 до 1024) означават същите права извън собствената Фирма; интеграцията не се нуждае от тях.
| Област | Минимум за описаната процедура |
|---|---|
resource – медийни файлове | 12 (преглед, добавяне) |
device_layer_top – кампании | 12 (преглед, добавяне) |
report_layer_top – отчети за кампании | 4 (преглед) |
location – локации | 4 (преглед) |
device_info – устройства | 4 (преглед) |
Активирането, паузата и спирането на кампания изискват правото Добавяне. За изтриване на активирана кампания или медиен файл е необходимо правото Изтриване; чернова на кампания може да бъде изтрита и без него. Добра отправна точка е ролята Мениджър на рекламата на фирма, от която премахнете ненужните права.
Кодове за грешки
| Код | Значение | Препоръчани действия |
|---|---|---|
400 | Невалидна заявка | Проверете идентификаторите в адреса, часовата зона и задължителните данни. |
401 | Липсва право | Потребителят няма необходимото право или достъп до съответната Фирма. При кампаниите най-често липсва правото Добавяне. |
404 | Не е намерено | Записът не съществува или не принадлежи на посочената Фирма. |
406 | Не може да се изпълни | Невалидни данни за вход или кампанията е в състояние, от което исканият преход не е разрешен (напр. спряна). |
409 | Конфликт на състоянието | Създаваната кампания не е в състояние чернова. |
413 | Файлът е твърде голям | Намалете размера на файла; ограниченията са посочени в стъпка 2. |
500 | Грешка на сървъра | Повторете заявката по-късно; ако грешката се повтаря, свържете се с доставчика. |
Първо изпробвайте интеграцията в тестова среда или на устройство, което не се вижда от публиката — активираната кампания наистина се възпроизвежда на производствените устройства. Извън работното време на локацията не се възпроизвежда никакво съдържание, дори при кампания с денонощен график.
Съхранявайте идентификаторите на медийните файлове и кампаниите (id, groupId) в собствената си система; интерфейсът не предлага търсене на кампании по име. Качвайте медийните файлове един по един и не изисквайте отчети по-често от веднъж на няколко минути. Разчитайте само на адресите, посочени в това ръководство.
Пълен пример
Скриптът изпълнява цялата процедура от качването на изображение до активирането на кампания на всички устройства на Фирмата. Изисква инструментите curl и jq.
#!/usr/bin/env bash
set -euo pipefail
API="https://admin.example.org"
AUTH="${INTEGRATION_AUTH:?задайте INTEGRATION_AUTH=login:parola}"
FILE="summer-sale.jpg"
NAME="Лятно намаление 2026"
FROM="2026-11-02T00:00:00"
TO="2026-11-09T00:00:00"
TZ_OFFSET="+02:00"
# 1) идентификатор на Фирмата
COMPANY=$(curl -sf -u "$AUTH" "$API/api/public/login" | jq -r '.company.id')
# 2) качване на медиен файл
RESOURCE=$(curl -sf -u "$AUTH" -X PUT \
"$API/api/resource/single/$COMPANY" \
-H "file-type: IMAGE" \
-H "file-mime: image/jpeg" \
-H "file-name: $FILE" \
-H "file-suffix: jpg" \
--data-binary "@$FILE" | jq -r '.id')
# 3) шаблон на кампания
curl -sf -u "$AUTH" "$API/api/campaign/company/$COMPANY" > template.json
# 4) редактиране на шаблона
jq --argjson res "$RESOURCE" --arg n "$NAME" --arg from "$FROM" --arg to "$TO" '
.name = $n
| .start = $from
| .end = $to
| .locations[].devices[].isActive = true
| .visuals = [{
id: 1, name: "Основен визуален материал", isPrimary: true, isCustom: true,
res: [{ id: 1, conditionId: 0, resourceId: $res,
name: $n, duration: 10000, type: 2 }]
}]
' template.json > campaign.json
# 5) създаване на чернова
RESPONSE=$(curl -sf -u "$AUTH" -X POST \
"$API/api/campaign/company/$COMPANY" \
-H "Content-Type: application/json" \
--data @campaign.json)
CAMPAIGN=$(echo "$RESPONSE" | jq -r '.id')
GROUP=$(echo "$RESPONSE" | jq -r '.groupId')
# 6) активиране
curl -sf -u "$AUTH" -X PATCH \
"$API/api/campaign/company/$COMPANY/$CAMPAIGN/$TZ_OFFSET/0" > /dev/null
echo "Кампания $CAMPAIGN е активирана, отчет: $API/api/report/$COMPANY/campaign/$GROUP"Свързани теми и следващи стъпки
← Назад към прегледа – Интеграции и създаване на съдържание
Свържете се с Вашия доставчик на софтуер.
