Annual Ads

Dokumentacja dla programistów

Twórz bezpośrednio na platformie Annual Ads — dodawaj reklamodawców, publikuj reklamy, inicjuj płatności i śledź pozycję w rankingu — wszystko za pośrednictwem API.

Zobacz pełną tabelę cenową

Zachowujesz 70% z kwoty, jaką reklamodawcy korzystający z trybu Connect płacą za swoje reklamy — środki są automatycznie przekazywane do Twojego portfela. Poniżej dowiesz się, jak to działa.

Adres bazowy

https://api.adhub365.com
OpenAPI 3

Uwierzytelnianie

Każde żądanie jest uwierzytelniane za pomocą tajnego klucza zawartego w nagłówku „Authorization”, z wykorzystaniem schematu „Bearer”.

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

Środowisko testowe i produkcyjne

Klucze środowiska testowego i produkcyjnego są całkowicie od siebie odizolowane — klucz środowiska testowego nigdy nie może odczytywać ani zapisywać danych utworzonych przez klucz produkcyjny i odwrotnie.

Zakresy

Każdy klucz ma ograniczony zakres działania do tego, który został mu przypisany — klucz nigdy nie ma szerszego dostępu niż konto partnera, które go utworzyło.

Klucze API są przyznawane zatwierdzonym kontom partnerskim przez zespół Annual Ads.

Załóż konto partnerskie

Podział przychodów z reklam

Jeśli Twoje klucze API służą do tworzenia kont reklamodawców dla Twoich użytkowników (tryb Connect — zob. sekcję „Uwierzytelnianie” powyżej), otrzymujesz część kwoty, jaką ci reklamodawcy płacą za swoje reklamy. Poniższy podział jest odczytywany na bieżąco z tego samego punktu końcowego, nigdy nie jest zakodowany na stałe i jest całkowicie niezależny od prowizji za polecenie, o której mowa w dalszej części tej strony.

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

70%

To dla ciebie

Środki są automatycznie wypłacane na skonfigurowany portfel wypłat — nie trzeba składać wniosku o wypłatę.

30%

Przejdź do reklam rocznych

Obejmuje moderację, hosting oraz infrastrukturę rankingową, w ramach której wyświetlane są Twoje reklamy.

Jak to działa

  1. Jeden z reklamodawców korzystających z trybu Connect opłaca reklamę za pośrednictwem Twojej integracji.
  2. Reklama jest sprawdzana i zatwierdzana — automatycznie lub przez nasz zespół moderatorów.
  3. Twoja część została umieszczona w kolejce do automatycznej wypłaty na Twój portfel – działa to na tej samej zasadzie, co opisany poniżej program poleceń.
Udział w zyskach nie jest nigdy przyznawany przed faktycznym zatwierdzeniem reklamy — jeśli zostanie ona odrzucona przez moderatorów, nie przysługuje żadna kwota z tytułu tej płatności. Doładowanie już aktywnej reklamy nie wiąże się z takim ryzykiem, a udział w zyskach jest przyznawany natychmiast.

Warunki wypłaty

  • Na koncie partnerskim skonfigurowano portfel do wypłat kryptowalut.
  • Nie musisz przechodzić procesu weryfikacji tożsamości (KYC) — Twoje konto partnerskie zostało już zweryfikowane w momencie jego utworzenia.

Przykład: odczyt liczby zgromadzonych udziałów

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
}

Punkty końcowe

Konta

POST/v1/partner/advertisers

Utwórz konto reklamodawcy w imieniu jednego ze swoich użytkowników (tryb „Connect”).

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

Sprawdź konto reklamodawcy utworzone przez tego partnera.

advertisers:read

Reklamy

POST/v1/partner/ads

Utwórz reklamę. Początkowo ma ona status „wersja robocza”. Opcjonalne pola `advertiser_type`, `promotion_type`, `link_type` i `promoted_brand` określają, czy jest to reklama partnerska, polecająca, tworzona przez twórcę treści czy indywidualna — zobacz uwagę poniżej.

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

Znajdź ogłoszenie.

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

Zaktualizuj treść redakcyjną — tytuł, opis, link, rodzaj reklamodawcy, rodzaj promocji, rodzaj linku oraz promowaną markę. Kategorie, lokalizacja geograficzna oraz wszelkie dane odczytywane przez silnik rankingowy nie mogą być tutaj zmieniane.

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

Prześlij bezpośrednio obraz reklamowy (JPEG/PNG/WebP, maks. 5 MB). Wymagane przed dokonaniem pierwszej płatności — zobacz sekcję dotyczącą płatności poniżej.

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

Ustaw obraz reklamy, podając adres URL zamiast przesyłać plik — serwer sam pobiera go i umieszcza na swoich serwerach. Ten sam wymóg: należy to zrobić przed pierwszą płatnością.

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

Aktualna pozycja, kategoria i zasięg geograficzny reklamy.

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

Łączna liczba wyświetleń i kliknięć reklamy — liczba dni, które upłynęły lub pozostały — pochodzi z pól „activated_at” i „expires_at” zawartych już w żądaniu GET /{id}, a pozycja w rankingu — z żądania GET /{id}/rank.

ads:read

Płatności

POST/v1/partner/payments

Rozpocznij płatność kryptowalutową w celu dokonania pierwszego zakupu lub doładowania. Pierwsza płatność zakończy się niepowodzeniem z kodem błędu 422, chyba że reklama zawiera już obraz — zobacz sekcję „uploadAdImage/setAdImageUrl” powyżej.

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

Sprawdź status płatności.

payments:read

Polecenia

POST/v1/partner/referrals

Utwórz link polecający.

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

Łączne zarobki z poleceń w podziale na statusy.

referrals:read

Podział przychodów z reklam

GET/v1/partner/ad-revenue/earnings

Twój 70-procentowy udział w kwotach, jakie reklamodawcy, których utworzyłeś w trybie Connect, zapłacili za swoje reklamy, w podziale według statusu.

ad-revenue:read

Dziennik dostępu

GET/v1/partner/access-log

Pełna historia wywołań dla tego klucza — metoda, ścieżka, adres IP, sygnał czasowy.

Tam

Punkty końcowe publiczne

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

Ranking tylko do odczytu dla danej kategorii i obszaru geograficznego.

Publiczne
GET/v1/tiers

7 skonfigurowanych poziomów cenowych (próg, odblokowane korzyści).

Publiczne
GET/v1/referral-program

Obecnie obowiązujące stawki prowizji w ramach systemu kaskadowego poleceń oraz programu Leaders Pool.

Publiczne
GET/v1/partner-program

Obecny podział przychodów z reklam (tryb Connect) między Ciebie a Annual Ads.

Publiczne
GET/v1/search?q={query}

Wyszukiwanie w języku naturalnym — kieruje zapytanie typu „reklamodawcy mebli w Kenii” do odpowiedniej kategorii i obszaru geograficznego, a następnie zwraca ranking wyników w dokładnie takiej kolejności, w jakiej się pojawiają.

Publiczne

Reklama partnerska i polecająca

advertiser_type, promotion_type, link_type oraz promoted_brand to pola opcjonalne w żądaniach POST i PATCH wysyłanych na adres /v1/partner/ads — serwis Annual Ads nie ogranicza się wyłącznie do firm reklamujących samych siebie. Gdy link_type ma wartość affiliate_link lub referral_invitation_link, albo promotion_type ma wartość affiliate_offer lub referral_opportunity, affiliate_terms_accepted musi mieć wartość true, w przeciwnym razie żądanie zostanie odrzucone z kodem 422. Długość pola title jest ograniczona do 35 znaków, a pola description do 80 — oba ograniczenia są egzekwowane po stronie serwera, a nie tylko w interfejsie użytkownika pulpitu nawigacyjnego.

Narzędzia AI

Każde konto reklamodawcy otrzymuje zestaw wbudowanych narzędzi opartych na sztucznej inteligencji — generator treści i elementów wizualnych reklam, asystenta konwersacyjnego, doradcę ds. budżetu oraz zewnętrzny audyt SEO — za które płaci się kredytami AI, oprócz stałej opłaty rocznej.

Działają one poprzez logowanie do panelu reklamodawcy (token dostępu do sesji), a nie za pomocą klucza API partnera — integracja zewnętrzna nie może ich wywoływać w imieniu reklamodawcy.
POST/v1/advertisers/{id}/ai/assistant

Zapytaj Annual Ads — pływający asystent konwersacyjny, służący wyłącznie do celów informacyjnych, z dostępem tylko do odczytu danych konta.

Publiczne
POST/v1/advertisers/{id}/ai/creative-studio

Wygeneruj tytuł reklamy, opis i słowa kluczowe na podstawie krótkiego opisu działalności.

2 punktów
POST/v1/advertisers/{id}/ai/creative-studio/image

Wygeneruj grafikę ogłoszenia (PNG) na podstawie tego samego opisu firmy, która zostanie umieszczona na serwerze i będzie gotowa do dołączenia do ogłoszenia.

8 punktów
POST/v1/advertisers/{id}/ai/budget-advisor

Rzeczywista prognoza statystyczna — a nie domysł oparty na modelu generatywnym — dotycząca prawdopodobieństwa utrzymania danej pozycji w rankingu po 30, 90 i 365 dniach.

1 punktów
POST/v1/advertisers/{id}/ai/seo-audit

Przeanalizuj zewnętrzną stronę internetową reklamodawcy i zaproponuj konkretne działania mające na celu poprawę pozycjonowania (SEO).

2 punktów

Przykład — generowanie treści reklamowej

Ta sama kategoria i opis działalności stanowią również podstawę działania poniższego generatora obrazów.

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
}

Wygeneruj pasujący element graficzny do tej samej reklamy:

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
}

Widżet

Umieść gotowy blok reklamowy na swojej stronie — bez konieczności tworzenia go od podstaw i bez użycia iframe. Skrypt wyświetla się bezpośrednio na stronie w izolowanym Shadow DOM, dzięki czemu jego style nigdy nie przenikają do Twojej witryny, a style Twojej witryny nigdy nie przenikają do niego.

Dodaj to do swojej strony

<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>

Domyślnie wyświetlany jest pełny, publiczny ranking dla danej kategorii — obejmujący wszystkich reklamodawców na platformie, a nie tylko tych, których pozyskałeś. Aby wyświetlić wyłącznie reklamy reklamodawców, których utworzyłeś w trybie Connect (czyli tych, którzy generują Twój udział), dodaj atrybut „data-partner” wraz ze swoim identyfikatorem partnera (znajdziesz go na stronie „Deweloperzy” w swoim panelu użytkownika):

<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>

Jeśli Twoi reklamodawcy należą do kilku kategorii, całkowicie pomiń atrybut „data-category” — dzięki samemu atrybutowi „data-partner” widżet wyświetli wszystkie Twoje reklamy ze wszystkich kategorii w jednej siatce, zamiast wymagać osobnego bloku widżetu dla każdej kategorii:

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

Chcesz, aby obok widżetu umieszczonego w treści pojawił się widżet w stopce, a każdy z nich wyświetlał inne reklamy? Dodaj drugi blok widżetu z atrybutem data-layout="compact" (pojedyncza reklama, którą można zwinąć do niewielkiej pigułki) oraz ustaw atrybut data-offset na liczbę reklam, które wyświetla już pierwszy widżet:

<!-- 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>

Atrybuty

data-categoryIdentyfikator kategorii do wyświetlenia. Wymagane — chyba że ustawiono parametr „data-partner”; w takim przypadku pominięcie tej wartości spowoduje wyświetlenie reklam tego partnera we wszystkich kategoriach.
data-geoZakres geograficzny: lokalny, regionalny lub globalny. Domyślnie ustawiony jest zakres globalny.
data-countLiczba wyświetlanych reklam. Domyślnie 4.
data-columnsLiczba kolumn siatki. Domyślnie 2.
data-layoutukład siatki, lista lub kompaktowy. Domyślnie ustawiony jest układ siatki. Układ kompaktowy wyświetla pojedynczą reklamę (wartość atrybutu `data-count` jest ignorowana) wraz z przyciskiem umożliwiającym zwinięcie jej do niewielkiej pigułki i ponowne rozwinięcie — jest to element w stylu stopki, który skrypt sam nigdy nie pozycjonuje jako stały; użytkownik sam umieszcza i stylizuje element `div` zawierający reklamę na swojej stronie według własnego uznania.
data-offsetLiczba reklam z najwyższych pozycji, które należy pominąć. Domyślna wartość to 0. Pozwala to drugiemu widżetowi na tej samej stronie (np. kompaktowemu w stopce oraz widżetowi w układzie siatki umieszczonemu wyżej) wyświetlać inne reklamy zamiast powtarzać tę samą dwukrotnie — należy podać liczbę reklam, które wyświetla już drugi widżet.
data-partnerTwój identyfikator partnera (znajdziesz go na stronie „Programiści” w swoim panelu użytkownika). Opcjonalne — bez tego identyfikatora widżet wyświetla pełny ranking publiczny dla tej kategorii, obejmujący wszystkich reklamodawców na platformie. Z tym identyfikatorem wyświetlane są wyłącznie reklamy reklamodawców, których pozyskałeś w trybie Connect — czyli tych, którzy faktycznie generują twój udział w zyskach.

Udział w przychodach

Jak prowizja za polecenie faktycznie trafia do partnera — stawka procentowa, sposób wypłaty oraz warunki wstępne.

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
}

Nie jest to stała liczba

Wysokość prowizji jest ustalana przez nas i może ulec zmianie — należy zawsze pobierać aktualną wartość z tego punktu końcowego, zamiast zakodować ją na stałe.

W pełni automatyczny

Nie ma terminu zakończenia wypłaty. Zaplanowane zadanie nalicza należne zarobki, grupuje je według reklamodawców i automatycznie wypłaca je po spełnieniu wszystkich poniższych warunków.

Warunki wypłaty

  • Łączna kwota należnych wynagrodzeń reklamodawcy osiąga minimalną kwotę wypłaty.
  • Na ich koncie skonfigurowano portfel służący do wypłat kryptowalut.
  • Ich status KYC został zweryfikowany.

Przykład: odczytanie skumulowanych zysków

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
}

Poziomy cenowe (aktualne)

Odczytuj dane na żywo z tego punktu końcowego — nigdy nie wpisuj tych wartości na stałe, ponieważ mogą one ulec zmianie z naszej strony. Zamiast pola z kwotą bezpłatną, stwórz dla swoich użytkowników selektor pakietów: każda wyświetlana cena jest już dokładną kwotą do wysłania podczas tworzenia płatności, a wyświetlane tutaj odblokowane korzyści dokładnie informują użytkowników, co otrzymują za tę cenę, dzięki czemu wybierają cenę, którą rozumieją, zamiast zgadywać kwotę.

PoziomCenaOdblokowania
Bronze$50.00

Basic visibility

Silver$300.00

Clickable link unlocked

Link, który można kliknąć
Gold$500.00

Animation unlocked

Link, który można kliknąćAnimacja
Platinum$1,000.00

Enhanced exposure

Link, który można kliknąćAnimacja
Diamond$2,500.00

Premium placement

Link, który można kliknąćAnimacja
Elite$5,000.00

Top-tier visibility

Link, który można kliknąćAnimacja
Legendary$10,000.00

Maximum visibility & branding

Link, który można kliknąćAnimacja

Limity częstotliwości

Liczba żądań jest ograniczona na klucz na minutę. Każda uwierzytelniona odpowiedź zawiera nagłówki X-RateLimit-Limit, X-RateLimit-Remaining oraz X-RateLimit-Reset; przekroczenie limitu powoduje zwrot kodu 429 Too Many Requests wraz z nagłówkiem Retry-After.

Lista dozwolonych adresów IP

Opcjonalne, dla każdego partnera. Dopóki nie dodasz wpisu, klucze tego partnera akceptują żądania z dowolnego adresu IP — pierwszy wpis powoduje, że wszystkie klucze tego partnera będą akceptować żądania wyłącznie z listy dozwolonych adresów.

Webhooki

Każdy webhook jest podpisywany algorytmem HMAC-SHA256 przy użyciu klucza tajnego generowanego jednorazowo w momencie utworzenia — przed uznaniem treści za wiarygodną należy zweryfikować podpis. Zdarzenia są przekazywane wyłącznie do partnera, który jest właścicielem danego reklamodawcy.

payment.succeededPłatność została potwierdzona.
payment.refundedZwrot środków został zrealizowany.
ad.activatedOgłoszenie zostaje opublikowane – automatycznie lub po sprawdzeniu przez administratora.
invoice.issuedWystawiono fakturę.
referral.payout.completedProwizja za polecenie osiąga status „wypłacona”.
referral.payout.failedTransakcja wypłaty wynagrodzenia za polecenie kończy się niepowodzeniem u dostawcy — środki powracają do puli środków do wypłaty i są ponownie przetwarzane.
rank.changedPozycja reklamy ulega zmianie — w tym również wtedy, gdy przyczyną tej zmiany jest wpłata dokonywana przez innego reklamodawcę.
ad.expiring_soon30, 7 lub 1 dzień przed wygaśnięciem ogłoszenia.
partner_ad_revenue.payout.completedWypłata z tytułu udziału w przychodach z reklam osiągnęła status „opłacona”.
partner_ad_revenue.payout.failedTransakcja zbiorcza wypłaty udziału w przychodach z reklam zakończyła się niepowodzeniem u dostawcy — kwoty powracają do pozycji „kwoty do wypłaty” i są ponownie przetwarzane.

Zestawy narzędzi programistycznych

Planowane jest udostępnienie oficjalnych zestawów SDK dla JavaScript/TypeScript i Pythona, wygenerowanych na podstawie tej samej specyfikacji API, ale nie zostały one jeszcze opublikowane — do tego czasu należy korzystać bezpośrednio z interfejsu API HTTP.

Szybki start

Na razie nie ma zestawu SDK — te rozwiązania korzystają bezpośrednio z interfejsu API HTTP i działają już teraz w dowolnym języku programowania.

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": "...",
    },
)