Створюйте рекламу безпосередньо на платформі Annual Ads — додавайте рекламодавців, публікуйте оголошення, ініціюйте платежі та відстежуйте рейтинг, використовуючи виключно API.
Переглянути повну таблицю цінВи зберігаєте 70% від суми, яку ваші рекламодавці в режимі Connect платять за свої оголошення — кошти автоматично надходять на ваш гаманець. Дізнайтеся, як це працює, нижче.
Кожен запит проходить аутентифікацію за допомогою секретного ключа в заголовку «Authorization» із використанням схеми «Bearer».
POST https://api.adhub365.com/v1/partner/ads
Authorization: Bearer sk_sandbox_...
Content-Type: application/jsonКлючі API видаються затвердженим обліковим записам партнерів командою Annual Ads.
Створити обліковий запис партнера| 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/tiers7 налаштованих цінових рівнів (поріг, доступні бонуси). | Відкритий доступ |
| 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 на додаток до фіксованої річної вартості.
| POST | /v1/advertisers/{id}/ai/assistantAsk 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» — тих, які фактично приносять вам частку доходу. |
Кількість запитів обмежена для кожного ключа за хвилину. Кожна автентифікована відповідь містить заголовки X-RateLimit-Limit, X-RateLimit-Remaining та X-RateLimit-Reset; у разі перевищення ліміту повертається код статусу 429 «Too Many Requests» із заголовком Retry-After.
Необов'язково, для кожного партнера. Доки ви не додасте запис, ваші ключі приймають запити з будь-якої 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": "...",
},
)