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

Відсотки комісії, що наразі діють для каскаду рефералів та «Пулу лідерів».

Відкритий доступ
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-аудитор — оплата за які здійснюється за допомогою кредитів AI на додаток до фіксованої річної вартості.

Ці функції виконуються через обліковий запис рекламодавця в панелі управління (токен доступу до сеансу), а не за допомогою 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Ваш ідентифікатор партнера (його можна знайти на сторінці «Розробники» у вашій особистій панелі управління). Необов’язкове поле — без нього віджет показує повний публічний рейтинг у цій категорії, тобто всіх рекламодавців на платформі. Якщо вказати цей ідентифікатор, будуть відображатися лише оголошення від рекламодавців, яких ви залучили через режим «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": "...",
    },
)