Annual Ads

Документација за програмере

Изградите директно на платформи Annual Ads — креирајте оглашиваче, објављујте огласе, покрените исплате и пратите рангирање, потпуно преко API-ја.

Погледајте целу табелу цена

Ви држите 70% од онога што ваши оглашивачи у Connect-mode плаћају за своје огласе — аутоматски уплаћено на ваш џеп. Погледајте како то функционише у наставку.

Основни 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

Пјесак и производња

Sandbox и production кључеви су потпуно издвојени једни од других — sandbox кључ никада не може да чита или пише податке које је креирао production кључ, и обрнуто.

Домети

Сваки кључ је ограничен на домене за које је издат — кључ никада нема више приступа него партнерски налог који га је креирао.

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-mode режиму плаћа оглас преко ваше интеграције.
  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

Креирајте налог оглашивача у име једног од ваших корисника (режим повезивања).

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 MB). Потребно пре прве уплате — погледајте групу уплата у наставку.

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

Потпуна историја позива за овај кључ — метод, путања, ИП адреса, временски жиг.

Там

Јавне крајње тачке

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. Наслов је ограничен на 35 знакова, а опис на 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 са ID-ом вашег партнера (пронађите га на страници за програмере на свом контролном табли):

<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решетка, листа или компакт. Подразумевано је решетка. Компакт приказује један оглас (број података се игнорише) са дугметом за скупљање у малу пилу и враћање — јединица у стилу подножја, коју сама скрипта никада не позиционира фиксно; контејнер 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.

Листа дозвољених ИП адреса

Опционално, по партнеру. Док не додате унос, ваши кључеви прихватају захтеве са било које ИП адресе — први унос пребацује све кључеве тог партнера на режим искључиво са одобрене листе.

Вебхукови

Сваки вебхук је потписан HMAC-SHA256 хешом, користећи тајну која се издаје једнократно при креирању — проверите потпис пре него што поверујете садржају. Догађаји се испоручују само партнеру који поседује одговарајућег оглашивача.

payment.succeededПлаћање је потврђено.
payment.refundedИзвршено је повраћај новца.
ad.activatedОглас постаје активан, аутоматски или након прегледа администратора.
invoice.issuedИздаје се фактура.
referral.payout.completedКомисија по упуту стиже до статуса плаћене.
referral.payout.failedПартија исплате по рефералу не успева код провајдера — зараде се враћају у стање за исплату и покушавају поново.
rank.changedРанг огласа се мења — укључујући и када то изазове уплата другог оглашивача.
ad.expiring_soon30, 7 или 1 дан(и) пре истека огласа.
partner_ad_revenue.payout.completedИсплата удела у приходима од огласа достиже статус плаћене.
partner_ad_revenue.payout.failedПакет исплате удела у приходу од огласа не успева код провајдера — удели се враћају у стање наплате и поново се покушавају.

Комплекти за развој софтвера

Званични JavaScript/TypeScript и Python SDK-ови, генерисани из исте спецификације 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": "...",
    },
)