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.
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/jsonKlucze API są przyznawane zatwierdzonym kontom partnerskim przez zespół Annual Ads.
Załóż konto partnerskie| POST | /v1/partner/advertisersUtwó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 |
| POST | /v1/partner/adsUtwó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}/imagePrześ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-urlUstaw 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}/rankAktualna 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 |
| POST | /v1/partner/paymentsRozpocznij 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 |
| POST | /v1/partner/referralsUtwórz link polecający. | referrals:write |
| GET | /v1/partner/referrals/{code}/earningsŁączne zarobki z poleceń w podziale na statusy. | referrals:read |
| GET | /v1/partner/ad-revenue/earningsTwó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 |
| GET | /v1/partner/access-logPełna historia wywołań dla tego klucza — metoda, ścieżka, adres IP, sygnał czasowy. | Tam |
| GET | /v1/rankings?category={id}&geo={scope}Ranking tylko do odczytu dla danej kategorii i obszaru geograficznego. | Publiczne |
| GET | /v1/tiers7 skonfigurowanych poziomów cenowych (próg, odblokowane korzyści). | Publiczne |
| GET | /v1/referral-programObecnie obowiązujące stawki prowizji w ramach systemu kaskadowego poleceń oraz programu Leaders Pool. | Publiczne |
| GET | /v1/partner-programObecny 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.
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.
| POST | /v1/advertisers/{id}/ai/assistantZapytaj 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-studioWygeneruj 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/imageWygeneruj 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-advisorRzeczywista 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-auditPrzeanalizuj zewnętrzną stronę internetową reklamodawcy i zaproponuj konkretne działania mające na celu poprawę pozycjonowania (SEO). | 2 punktów |
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
}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.
<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>data-category | Identyfikator 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-geo | Zakres geograficzny: lokalny, regionalny lub globalny. Domyślnie ustawiony jest zakres globalny. |
data-count | Liczba wyświetlanych reklam. Domyślnie 4. |
data-columns | Liczba kolumn siatki. Domyślnie 2. |
data-layout | ukł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-offset | Liczba 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-partner | Twó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. |
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.
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.
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.succeeded | Płatność została potwierdzona. |
payment.refunded | Zwrot środków został zrealizowany. |
ad.activated | Ogłoszenie zostaje opublikowane – automatycznie lub po sprawdzeniu przez administratora. |
invoice.issued | Wystawiono fakturę. |
referral.payout.completed | Prowizja za polecenie osiąga status „wypłacona”. |
referral.payout.failed | Transakcja 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.changed | Pozycja reklamy ulega zmianie — w tym również wtedy, gdy przyczyną tej zmiany jest wpłata dokonywana przez innego reklamodawcę. |
ad.expiring_soon | 30, 7 lub 1 dzień przed wygaśnięciem ogłoszenia. |
partner_ad_revenue.payout.completed | Wypłata z tytułu udziału w przychodach z reklam osiągnęła status „opłacona”. |
partner_ad_revenue.payout.failed | Transakcja 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. |
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.
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": "...",
},
)