Skip to content
  1. Компоненты
  2. BannerPro
  3. Для разработчика
  4. REST API

REST API

HTTP API для внешних систем: баннеры, позиции, статистика, audit и preset-шаблоны. Запись баннеров через JSON опциональна.

Версия API: 1.1.0 (константа BANNERPRO_REST_VERSION в include/rest.php).

Точка входа:

text
assets/components/bannerpro/api.php

REST не использует сессию менеджера и ACL пользователя. Доступ только по ключу bannerpro_api_key. Записи в audit идут от username rest-api.

Connector админки (connector.php) работает отдельно: POST action, сессия mgr, права bannerpro_*.

Включение

  1. Система → Настройки системы → namespace bannerpro.
  2. bannerpro_api_enabled = Да.
  3. Скопируйте bannerpro_api_key (Ключ API).
  4. Для POST/PATCH: bannerpro_api_write_enabled = Да.
НастройкаПо умолчаниюНазначение
bannerpro_api_enabledfalseВключает API
bannerpro_api_keyпустоBearer-токен (32 hex при install, если поле пустое)
bannerpro_api_write_enabledfalsePOST/PATCH баннеров
bannerpro_api_cors_originпустоCORS: *, origin или список через запятую
bannerpro_api_rate_limit0Запросов в минуту на ключ (0 = без лимита)

Подробнее: Системные настройки.

Маршрутизация

Путь передают query-параметром route или path:

text
https://example.com/assets/components/bannerpro/api.php?route=/ads&limit=10

Фильтры не вкладывайте в route:

text
✓ ?route=/ads&tag=sale&limit=10
✗ ?route=/ads?tag=sale          → 404

PATH_INFO (/api.php/ads) на nginx часто отдаёт 404 MODX. Preflight OPTIONS204, если настроен CORS.

Ключ API

В примерах curl плейсхолдер YOUR_API_KEY: значение bannerpro_api_key.

СпособПуть
МенеджерСистема → Настройки системы → namespace bannerproREST API ключ
Базаmodx_system_settings, ключ bannerpro_api_key

При установке или обновлении resolver записывает 32 hex-символа, если поле было пустым. После смены ключа очистите кэш MODX.

Аутентификация

http
Authorization: Bearer YOUR_API_KEY
СпособПример
ЗаголовокAuthorization: Bearer …
X-API-KeyX-API-Key: YOUR_API_KEY
Query (не для prod)?api_key=YOUR_API_KEY
КодmessageПричина
401unauthorizedКлюч отсутствует или неверен
403write disabledPOST/PATCH при выключенном bannerpro_api_write_enabled
404not foundМаршрут или сущность
429rate limit exceededПревышен bannerpro_api_rate_limit (+ Retry-After: 60)
503api disabledВыключен bannerpro_api_enabled

Формат ответа

Успех:

json
{
  "success": true,
  "data": {},
  "total": 0
}

Ошибка:

json
{
  "success": false,
  "message": "not found"
}

List-эндпоинты отдают total в теле и заголовке X-Total-Count. При наличии соседних страниц добавляют заголовок Link (rel="prev" / rel="next").

Параметр fields=id,name,active сужает проекцию полей.

Пагинация: offset (алиас start, default 0), limit (default 20, max 500).

Сводка маршрутов

МетодМаршрутWriteОписание
GET/Discovery (версия, список routes)
GET/adsСписок баннеров
GET/ads/{id}Баннер + счётчики
GET/ads/{id}/clicksЖурнал кликов
POST/adsСоздать баннер
PATCH/ads/{id}Обновить баннер
POST/ads/from-templateИз preset-шаблона
GET/positionsСписок позиций
GET/positions/{id}Одна позиция
GET/positions/{id}/adsБаннеры позиции
GET/statssummary + by_day + top_ads
GET/stats/summaryKPI
GET/stats/by-dayПо дням
GET/stats/top-adsТоп баннеров
GET/stats/referrersReferrer
GET/stats/exportCSV
GET/stats/compareСравнение периодов
GET/auditЖурнал
GET/templatesPreset-шаблоны

CRUD позиций через REST не реализован. DELETE баннеров через REST нет.

OpenAPI-описание в репозитории пакета: docs/openapi.yaml.

GET /ads

ПараметрОписание
queryПоиск по name/description
active0 / 1
typeimage / html
product_id, category_idТаргетинг MS3
tagМетка
position, modeinclude / exclude
on_schedule1: только «на расписании сейчас»
sort, dirid, name, active, start, end
offset, limit, fieldsПагинация, проекция

В строке: clicks, conversions, impressions, positions[], current_image, …

bash
curl -s -H "Authorization: Bearer YOUR_API_KEY" \
  "https://example.com/assets/components/bannerpro/api.php?route=/ads&limit=10&active=1"

GET /stats и подмаршруты

Общие параметры: period (default all), from, to, position (0 = все).

periodАлиасы
alloverall
today
last_7_dayslast7days, 7days
this_weekthisweek
last_weeklastweek
this_monththismonth, month
last_monthlastmonth
this_yearthisyear

Кастомный диапазон: from + to (YYYY-MM-DD или с временем).

GET /stats/compare: base (default this_week), compare (default last_week), position → объекты base, compare, delta.

GET /stats/export отдаёт CSV, не JSON. Параметр type: clicks, impressions, referrers, report / summary.

В сводке и by_day есть поле conversions (заказы MS3 с атрибуцией клика).

GET /audit и GET /templates

Audit: фильтры entity, action, sort (default id), dir (default DESC), пагинация. Username в REST: rest-api.

Templates: preset-шаблоны из bannerpro_ad_templates + defaults_data.

Запись (POST / PATCH)

Нужны Content-Type: application/json и bannerpro_api_write_enabled=1.

Whitelist полей: name, url, image, source, active, description, type, html, start, end, newimage, product_id, category_id, max_clicks, max_impressions, show_hours, target_resource_id, target_parent_id, tags, массив positions.

POST /ads: обязателен name. Audit: create.

PATCH /ads/{id}: поле positions[] снимает все привязки, [1,2] заменяет список. Если positions нет в теле, привязки не меняются. Audit: update.

POST /ads/from-template: { "template_id": 1, "positions": [3] }. Audit: create_from_template.

bash
API="https://example.com/assets/components/bannerpro/api.php"
KEY="YOUR_API_KEY"

curl -s -X POST \
  -H "Authorization: Bearer ${KEY}" \
  -H "Content-Type: application/json" \
  -d '{"name":"REST Banner","type":"html","html":"<p>Hi</p>","positions":[3]}' \
  "${API}?route=/ads"

CORS и rate limit

CORS (bannerpro_api_cors_origin): *, точный origin или список. Разрешённые методы: GET, POST, PATCH, OPTIONS.

Rate limit: bucket 1 минута на ключ в кэше MODX. При превышении ответ HTTP 429.

Безопасность

  • Write выключен по умолчанию.
  • Не передавайте ключ во frontend.
  • Ограничьте api.php по IP на веб-сервере для internal API.
  • Используйте HTTPS.

См. также