Annual Ads

Документация для разработчиков

Создавайте рекламу непосредственно на платформе Annual Ads — добавляйте рекламодателей, публикуйте объявления, инициируйте платежи и отслеживайте позиции в рейтинге — и всё это исключительно через API.

Ознакомьтесь с полной таблицей цен

Вы сохраняете 70% от суммы, которую ваши рекламодатели в режиме «Connect» платят за свои объявления — средства автоматически поступают на ваш кошелек. Узнайте, как это работает, ниже.

Базовый URL

https://api.adhub365.com
OpenAPI 3

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

Каждый запрос проходит аутентификацию с помощью секретного ключа, указанного в заголовке «Authorization», с использованием схемы «Bearer».

POST https://api.adhub365.com/v1/partner/ads
Authorization: Bearer sk_sandbox_...
Content-Type: application/json

Тестовая среда и производственная среда

Ключи тестовой среды и производственной среды полностью изолированы друг от друга — ключ тестовой среды ни в коем случае не может читать или записывать данные, созданные ключом производственной среды, и наоборот.

Области применения

Каждый ключ ограничен сферами действия, в рамках которых он был выдан — ключ никогда не имеет более широких прав доступа, чем учетная запись партнера, которая его создала.

API-ключи выдаются утвержденным учетным записям партнеров командой Annual Ads.

Создать учетную запись партнера

Распределение доходов от рекламы

Если ваши API-ключи используются для создания аккаунтов рекламодателей для ваших собственных пользователей (режим «Connect» — см. раздел «Аутентификация» выше), вы получаете долю от суммы, которую эти рекламодатели платят за свою рекламу. Приведенное ниже соотношение долей считывается в режиме реального времени из этого же конечного пункта, никогда не задается жестко и полностью отличается от реферальной комиссии, описанной далее на этой странице.

GET https://api.adhub365.com/v1/partner-program
{
  "partner_share_percentage": 0.7,
  "platform_share_percentage": 0.3
}

70%

Это тебе

Средства автоматически перечисляются на ваш указанный кошелек для выплат — подавать заявку на вывод не требуется.

30%

Перейти к ежегодным объявлениям

Здесь рассматриваются вопросы модерации, размещения и инфраструктуры ранжирования, на основе которой показываются ваши объявления.

Как это работает

  1. Один из ваших рекламодателей, работающих в режиме Connect, оплачивает рекламу через вашу интеграцию.
  2. Реклама проходит проверку и утверждается — либо автоматически, либо нашей командой модераторов.
  3. Ваша доля поставлена в очередь на автоматическую выплату на ваш кошелек — по тому же принципу, что и в реферальной программе, описанной ниже.
Доля не начисляется до тех пор, пока объявление не будет фактически одобрено — если модерация отклонит его, выплата по данному платежу не производится. Пополнение средств на уже активное объявление не сопряжено с таким риском, и доля начисляется немедленно.

Условия выплаты

  • В вашем партнерском кабинете настроен кошелек для выплат в криптовалюте.
  • С вашей стороны не требуется прохождение процедуры KYC — ваш партнерский аккаунт уже прошел проверку при создании.

Пример: чтение накопленных долей

GET https://api.adhub365.com/v1/partner/ad-revenue/earnings
Authorization: Bearer sk_sandbox_...
{
  "shares": [
    {
      "id": "share_1a2b...",
      "payment_id": "pay_9f2a...",
      "ad_id": "ad_7c31...",
      "partner_amount_usd": 140.0,
      "platform_amount_usd": 60.0,
      "status": "paid",
      "payable_after": "2026-08-03T00:00:00Z",
      "paid_at": "2026-08-05T10:12:00Z"
    }
  ],
  "total_payable_pending_usd": 0.0,
  "total_payable_usd": 0.0,
  "total_processing_usd": 0.0,
  "total_paid_usd": 140.0
}

Конечные точки

Счета

POST/v1/partner/advertisers

Создайте аккаунт рекламодателя от имени одного из ваших пользователей (режим «Connect»).

advertisers:write
GET/v1/partner/advertisers/{id}

Найти аккаунт рекламодателя, созданный этим партнером.

advertisers:read

Реклама

POST/v1/partner/ads

Создайте объявление. Сначала оно будет находиться в статусе «Черновик». Необязательные поля `advertiser_type`, `promotion_type`, `link_type` и `promoted_brand` описывают партнерскую, реферальную, авторскую или индивидуальную рекламу — см. примечание ниже.

ads:write
GET/v1/partner/ads/{id}

Поискать объявление.

ads:read
PATCH/v1/partner/ads/{id}

Обновите редакционный контент — заголовок, описание, ссылку, тип рекламодателя, тип рекламной акции, тип ссылки и продвигаемый бренд. Категорию, географию и все остальные параметры, учитываемые системой ранжирования, здесь изменить невозможно.

ads:write
POST/v1/partner/ads/{id}/image

Загрузите изображение для объявления напрямую (форматы JPEG/PNG/WebP, максимальный размер — 5 МБ). Требуется до первого платежа — см. раздел «Платежи» ниже.

ads:write
POST/v1/partner/ads/{id}/image-url

Укажите изображение для рекламы по URL-адресу вместо загрузки файла — сервер сам загрузит его и разместит на своих серверах. Требование то же: необходимо выполнить до первого платежа.

ads:write
GET/v1/partner/ads/{id}/rank

Текущий рейтинг, категория и географический охват объявления.

ads:read
GET/v1/partner/ads/{id}/stats

Общее количество просмотров и кликов по объявлению, а также количество прошедших/оставшихся дней берутся из полей `activated_at` и `expires_at`, которые уже присутствуют в запросе GET /{id}, а рейтинг — из запроса GET /{id}/rank.

ads:read

Платежи

POST/v1/partner/payments

Инициируйте криптовалютный платеж для первоначальной покупки или пополнения счета. Первоначальный платеж завершится с ошибкой 422, если в объявлении ещё нет изображения — см. описание функций uploadAdImage/setAdImageUrl выше.

payments:write
GET/v1/partner/payments/{id}

Проверить статус платежа.

payments:read

Рекомендации

POST/v1/partner/referrals

Создайте реферальную ссылку.

referrals:write
GET/v1/partner/referrals/{code}/earnings

Совокупный доход от рефералов с разбивкой по статусам.

referrals:read

Распределение доходов от рекламы

GET/v1/partner/ad-revenue/earnings

Ваша доля в размере 70 % от суммы, уплаченной рекламодателями, которых вы привлекли в режиме «Connect», за их рекламные объявления, с разбивкой по статусу.

ad-revenue:read

Журнал доступа

GET/v1/partner/access-log

Полная история вызовов для этого ключа — метод, путь, IP-адрес, временная метка.

Там

Общедоступные конечные точки

GET/v1/rankings?category={id}&geo={scope}

Рейтинг, доступный только для чтения, по категории и географическому охвату.

Открытый доступ
GET/v1/tiers

7 настроенных ценовых уровней (пороговое значение, доступные бонусы).

Открытый доступ
GET/v1/referral-program

Процентные ставки комиссионных, действующие в настоящее время для каскада рефералов и программы «Leaders Pool».

Открытый доступ
GET/v1/partner-program

Текущее распределение доходов от рекламы (в режиме «Connect») между вами и Annual Ads.

Открытый доступ
GET/v1/search?q={query}

Поиск на естественном языке — направляет запрос, например «рекламодатели мебели в Кении», в соответствующую категорию и географическую область, а затем возвращает рейтинг результатов в точном реальном порядке.

Открытый доступ

Партнерская и реферальная реклама

advertiser_type, promotion_type, link_type и promoted_brand — необязательные поля при отправке запросов POST и PATCH на /v1/partner/ads — сервис Annual Ads не ограничивается компаниями, рекламирующими только себя. Если link_type равен affiliate_link или referral_invitation_link, либо promotion_type равен affiliate_offer или referral_opportunity, то значение affiliate_terms_accepted должно быть true; в противном случае запрос отклоняется с кодом ошибки 422. Максимальная длина title составляет 35 символов, а description — 80; ограничения применяются на стороне сервера, а не только в интерфейсе панели управления.

Инструменты искусственного интеллекта

Каждый аккаунт рекламодателя получает набор встроенных инструментов на базе искусственного интеллекта — генератор рекламного контента и визуальных элементов, диалоговый помощник, консультант по бюджету и внешний SEO-аудитор — оплата которых производится с помощью кредитов ИИ в дополнение к фиксированной годовой стоимости.

Они запускаются через личный кабинет рекламодателя (токен доступа к сессии), а не через API-ключ партнера — сторонние интеграции не могут вызывать их от имени рекламодателя.
POST/v1/advertisers/{id}/ai/assistant

Ask Annual Ads — плавающий диалоговый помощник, предназначенный исключительно для предоставления информации и имеющий доступ к данным учетной записи только в режиме чтения.

Открытый доступ
POST/v1/advertisers/{id}/ai/creative-studio

Создать заголовок объявления, описание и ключевые слова на основе краткого описания компании.

2 кредит(ов)
POST/v1/advertisers/{id}/ai/creative-studio/image

Создать изображение объявления (в формате PNG) на основе того же описания компании, которое будет размещено на сервере и готово к прикреплению к объявлению.

8 кредит(ов)
POST/v1/advertisers/{id}/ai/budget-advisor

Реальный статистический прогноз — а не просто предположение — вероятности сохранения данного ранга через 30, 90 и 365 дней.

1 кредит(ов)
POST/v1/advertisers/{id}/ai/seo-audit

Проанализировать внешний веб-сайт самого рекламодателя и предложить конкретные меры по улучшению SEO.

2 кредит(ов)

Пример — создание рекламного контента

Эти же категория и описание деятельности лежат в основе работы приведенного ниже генератора изображений.

POST https://api.adhub365.com/v1/advertisers/{advertiser_id}/ai/creative-studio
Authorization: Bearer <session access token>
Content-Type: application/json

{
  "category_name": "Furniture",
  "business_description": "We sell handmade oak dining tables"
}
{
  "title": "Handmade Oak Dining Tables — Built to Last",
  "description": "Solid oak dining tables crafted by hand, built to last a lifetime.",
  "keywords": ["oak furniture", "dining table", "handmade"],
  "credits_remaining": 8
}

Создать соответствующий визуальный элемент для этой же рекламы:

POST https://api.adhub365.com/v1/advertisers/{advertiser_id}/ai/creative-studio/image
Authorization: Bearer <session access token>
Content-Type: application/json

{
  "category_name": "Furniture",
  "business_description": "We sell handmade oak dining tables"
}
{
  "visual_url": "https://cdn.uploadscenter.com/file_01m1...",
  "credits_remaining": 4
}

Виджет

Просто разместите готовый рекламный блок на своём сайте — без необходимости разработки и без использования iframe. Скрипт отображается непосредственно на странице в изолированном Shadow DOM, поэтому его стили никогда не влияют на ваш сайт, а стили вашего сайта — на него.

Добавьте это на свою страницу

<div
  class="annualads-widget"
  data-category="YOUR_CATEGORY_ID"
  data-geo="global"
  data-count="4"
  data-columns="2"
></div>
<script async src="https://adhub365.com/widget.js"></script>

По умолчанию здесь отображается полный публичный рейтинг по данной категории — все рекламодатели на платформе, а не только те, которых вы привлекли. Чтобы отображать только объявления от рекламодателей, которых вы привлекли через режим «Connect» (то есть тех, которые приносят вам долю дохода), добавьте атрибут `data-partner` со своим идентификатором партнера (его можно найти на странице «Разработчики» в личном кабинете):

<div
  class="annualads-widget"
  data-category="YOUR_CATEGORY_ID"
  data-geo="global"
  data-partner="YOUR_PARTNER_ID"
></div>
<script async src="https://adhub365.com/widget.js"></script>

Если ваши рекламодатели относятся к нескольким категориям, полностью исключите атрибут `data-category` — при использовании только атрибута `data-partner` виджет будет отображать все ваши объявления из всех категорий в одной сетке, вместо того чтобы создавать отдельный блок виджета для каждой категории:

<div
  class="annualads-widget"
  data-geo="global"
  data-partner="YOUR_PARTNER_ID"
></div>
<script async src="https://adhub365.com/widget.js"></script>

Хотите разместить блок в нижнем колонтитуле наряду с блоком внутри контента, причём в каждом из них будут отображаться разные объявления? Добавьте второй блок виджета с атрибутом data-layout="compact" (одно объявление, сворачиваемое в небольшую «таблетку») и атрибутом data-offset, значение которого соответствует количеству объявлений, уже отображаемых в первом виджете:

<!-- in your content -->
<div
  class="annualads-widget"
  data-category="YOUR_CATEGORY_ID"
  data-geo="global"
  data-count="4"
  data-columns="2"
></div>

<!-- in your footer, showing different ads via data-offset -->
<div
  class="annualads-widget"
  data-category="YOUR_CATEGORY_ID"
  data-geo="global"
  data-layout="compact"
  data-offset="4"
></div>
<script async src="https://adhub365.com/widget.js"></script>

Атрибуты

data-categoryИдентификатор категории для отображения. Обязательное поле — за исключением случаев, когда установлен атрибут `data-partner`; в этом случае его пропуск означает, что реклама данного партнера будет отображаться во всех категориях.
data-geoГеографический охват: местный, региональный или глобальный. По умолчанию — глобальный.
data-countКоличество отображаемых объявлений. По умолчанию — 4.
data-columnsКоличество столбцов сетки. По умолчанию — 2.
data-layout«grid», «list» или «compact». По умолчанию используется «grid». При значении «compact» отображается одно объявление (параметр «data-count» игнорируется) с кнопкой, позволяющей свернуть его в небольшой блок и снова развернуть — это элемент в стиле нижнего колонтитула, который скрипт сам по себе никогда не позиционирует фиксированно; вы можете размещать и оформлять контейнерный div на своей странице по своему усмотрению.
data-offsetКоличество рекламных объявлений из верхней части списка, которые следует пропустить. По умолчанию установлено значение 0. Позволяет второму виджету на той же странице (например, компактному виджету в нижнем колонтитуле и виджету в виде сетки, расположенному выше) показывать другие объявления вместо того, чтобы дважды повторять одно и то же — передайте количество объявлений, которые уже отображает другой виджет.
data-partnerВаш ID партнера (его можно найти на странице «Разработчики» в личном кабинете). Указание не является обязательным — без него виджет отображает полный публичный рейтинг по данной категории, включая всех рекламодателей на платформе. При его указании будут отображаться только объявления тех рекламодателей, которых вы привлекли через режим «Connect» — тех, которые фактически приносят вам долю дохода.

Доля выручки

Как именно партнер получает комиссию за привлечение клиентов — процент, механизм выплаты и необходимые условия.

GET https://api.adhub365.com/v1/referral-program
{
  "levels": [
    {
      "level": 1,
      "percentage": 0.1
    }
  ],
  "leaders_pool_percentage_of_gmv": 0.05,
  "founding_advertiser_pool_percentage_of_gmv": 0.05,
  "payout_verification_window_hours": 48,
  "min_payout_usd": 1
}

Не фиксированное число

Процент комиссии настраивается с нашей стороны и может изменяться — всегда следует получать его в режиме реального времени с этого конечного пункта, а не указывать значение явно в коде.

Полностью автоматический

Конечной точки вывода средств не предусмотрено. Запланированное задание начисляет подлежащие выплате доходы, группирует их по рекламодателям и автоматически осуществляет выплату, как только будут выполнены все перечисленные ниже условия.

Условия выплаты

  • Общая сумма подлежащих выплате доходов рекламодателя достигает минимальной суммы выплаты.
  • В их учетной записи настроен кошелек для получения криптовалютных выплат.
  • Их статус KYC подтвержден.

Пример: просмотр накопленной прибыли

GET https://api.adhub365.com/v1/partner/referrals/{code}/earnings
Authorization: Bearer sk_sandbox_...
{
  "code": "ann-2f8c",
  "earnings": [
    {
      "id": "earn_1a2b...",
      "payment_id": "pay_9f2a...",
      "amount_usd": 30.0,
      "status": "paid",
      "payable_after": "2026-08-01T00:00:00Z",
      "paid_at": "2026-08-03T14:22:00Z"
    }
  ],
  "total_payable_pending_usd": 0.0,
  "total_payable_usd": 0.0,
  "total_processing_usd": 0.0,
  "total_paid_usd": 30.0
}

Тарифные планы (в действии)

Получайте данные в режиме реального времени из этого конечного пункта — никогда не указывайте эти значения в коде напрямую, так как они могут измениться с нашей стороны. Создайте для своих пользователей инструмент выбора тарифного плана вместо поля для ввода свободной суммы: каждая указанная цена уже представляет собой точную сумму, которую необходимо отправить при формировании платежа, а отображаемые здесь доступные преимущества точно объясняют пользователям, что они получают за эту цену, поэтому они выбирают цену, которую понимают, а не угадывают цифру.

УровеньЦенаРазблокировка
Bronze$50.00

Basic visibility

Silver$300.00

Clickable link unlocked

Активная ссылка
Gold$500.00

Animation unlocked

Активная ссылкаАнимация
Platinum$1,000.00

Enhanced exposure

Активная ссылкаАнимация
Diamond$2,500.00

Premium placement

Активная ссылкаАнимация
Elite$5,000.00

Top-tier visibility

Активная ссылкаАнимация
Legendary$10,000.00

Maximum visibility & branding

Активная ссылкаАнимация

Ограничения по скорости

На количество запросов установлено ограничение в расчете на один ключ в минуту. Каждый аутентифицированный ответ содержит заголовки X-RateLimit-Limit, X-RateLimit-Remaining и X-RateLimit-Reset; при превышении лимита возвращается код ошибки 429 «Too Many Requests» с заголовком Retry-After.

Список разрешенных IP-адресов

Необязательно, для каждого партнера. До тех пор, пока вы не добавите запись, ваши ключи принимают запросы с любого IP-адреса — первая запись переключает все ключи данного партнера в режим работы только с белым списком.

Веб-хуки

Каждый веб-хук подписывается с помощью алгоритма HMAC-SHA256 с использованием секретного ключа, выдаваемого однократно при создании — перед тем как доверять содержимому, необходимо проверить подпись. События доставляются только партнеру, которому принадлежит соответствующий рекламодатель.

payment.succeededПлатеж подтвержден.
payment.refundedВозврат средств произведён.
ad.activatedОбъявление становится активным — автоматически или после проверки администратором.
invoice.issuedВыставлен счет.
referral.payout.completedКомиссия за привлечение клиента переходит в статус «оплаченной».
referral.payout.failedПартия выплат по рефералам завершилась сбоем на стороне провайдера — средства возвращаются в раздел «К выплате» и повторно обрабатываются.
rank.changedРейтинг объявления меняется — в том числе в случае, если это вызвано оплатой со стороны другого рекламодателя.
ad.expiring_soonЗа 30, 7 или 1 день до истечения срока действия объявления.
partner_ad_revenue.payout.completedВыплата доли дохода от рекламы перешла в статус «оплаченной».
partner_ad_revenue.payout.failedПартия выплат доли дохода от рекламы завершилась сбоем на стороне провайдера — доли возвращаются в раздел «К выплате» и повторно обрабатываются.

Наборы средств разработки программного обеспечения

Официальные SDK для JavaScript/TypeScript и Python, сгенерированные на основе этой же спецификации API, находятся в стадии разработки, но пока не опубликованы — до тех пор используйте HTTP-API напрямую.

Быстрый старт

SDK пока нет — эти решения напрямую обращаются к HTTP-API и уже сегодня работают на любом языке программирования.

cURL

curl -X POST https://api.adhub365.com/v1/partner/ads \
  -H "Authorization: Bearer sk_sandbox_..." \
  -H "Content-Type: application/json" \
  -d '{"advertiser_id":"adv_9f2a...","category_id":"cat_furniture","geo_scope":"local","title":"..."}'

JavaScript

await fetch("https://api.adhub365.com/v1/partner/ads", {
  method: "POST",
  headers: {
    Authorization: "Bearer sk_sandbox_...",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    advertiser_id: "adv_9f2a...",
    category_id: "cat_furniture",
    geo_scope: "local",
    title: "...",
  }),
});

Python

import requests

requests.post(
    "https://api.adhub365.com/v1/partner/ads",
    headers={"Authorization": "Bearer sk_sandbox_..."},
    json={
        "advertiser_id": "adv_9f2a...",
        "category_id": "cat_furniture",
        "geo_scope": "local",
        "title": "...",
    },
)