Создавайте рекламу непосредственно на платформе Annual Ads — добавляйте рекламодателей, публикуйте объявления, инициируйте платежи и отслеживайте позиции в рейтинге — и всё это исключительно через API.
Ознакомьтесь с полной таблицей ценВы сохраняете 70% от суммы, которую ваши рекламодатели в режиме «Connect» платят за свои объявления — средства автоматически поступают на ваш кошелек. Узнайте, как это работает, ниже.
Каждый запрос проходит аутентификацию с помощью секретного ключа, указанного в заголовке «Authorization», с использованием схемы «Bearer».
POST https://api.adhub365.com/v1/partner/ads
Authorization: Bearer sk_sandbox_...
Content-Type: application/jsonAPI-ключи выдаются утвержденным учетным записям партнеров командой 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Процентные ставки комиссионных, действующие в настоящее время для каскада рефералов и программы «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-аудитор — оплата которых производится с помощью кредитов ИИ в дополнение к фиксированной годовой стоимости.
| 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 | Ваш ID партнера (его можно найти на странице «Разработчики» в личном кабинете). Указание не является обязательным — без него виджет отображает полный публичный рейтинг по данной категории, включая всех рекламодателей на платформе. При его указании будут отображаться только объявления тех рекламодателей, которых вы привлекли через режим «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": "...",
},
)