Gradite direktno na platformi Annual Ads — kreirajte oglašivače, objavljujte oglase, pokrenite isplate i pratite rang, sve putem API-ja.
Pogledajte cijeli cjenovnikZadržavate 70% od onoga što vaši oglašivači u Connect modu plaćaju za svoje oglase — automatski isplaćeno na vaš novčanik. Pogledajte kako to funkcionira u nastavku.
Svaki zahtjev se autentificira tajnim ključem u zaglavlju Autorizacija, koristeći Bearer shemu.
POST https://api.adhub365.com/v1/partner/ads
Authorization: Bearer sk_sandbox_...
Content-Type: application/jsonAPI ključevi se izdaju odobrenim partnerskim računima od strane tima za godišnje oglase.
Kreirajte partnerski račun| POST | /v1/partner/advertisersKreirajte račun oglašivača u ime jednog od vaših korisnika (Connect mod). | advertisers:write |
| GET | /v1/partner/advertisers/{id}Potražite oglašivački račun koji je kreirao ovaj partner. | advertisers:read |
| POST | /v1/partner/adsKreirajte oglas. Počinje u statusu nacrta. Opcionalna polja advertiser_type, promotion_type, link_type i promoted_brand opisuju partnersko, preporučeno, kreatorsko ili individualno oglašavanje — pogledajte napomenu ispod. | ads:write |
| GET | /v1/partner/ads/{id}Potraži oglas. | ads:read |
| PATCH | /v1/partner/ads/{id}Ažurirajte urednički sadržaj — naslov, opis, poveznica, vrsta oglašivača, vrsta promocije, vrsta poveznice i promovirani brend. Kategorija, geografija i sve što čita mehanizam rangiranja ovdje se nikada ne mogu promijeniti. | ads:write |
| POST | /v1/partner/ads/{id}/imageDirektno učitajte sliku oglasa (JPEG/PNG/WebP, najviše 5 MB). Potrebno prije prve uplate — pogledajte grupu plaćanja u nastavku. | ads:write |
| POST | /v1/partner/ads/{id}/image-urlPostavite sliku oglasa putem URL-a umjesto učitavanja datoteke — server je sam preuzima i hostuje. Isti zahtjev: potrebno prije prve uplate. | ads:write |
| GET | /v1/partner/ads/{id}/rankTrenutni rang, kategorija i geografski obuhvat oglasa. | ads:read |
| GET | /v1/partner/ads/{id}/statsUkupni pregledi i klikovi na oglas — dani protekli/preostali dolaze iz polja activated_at/expires_at već dostupnih na GET /{id}, a rang iz GET /{id}/rank. | ads:read |
| POST | /v1/partner/paymentsPokrenite kripto plaćanje za početnu kupovinu ili dopunu. Početno plaćanje ne uspijeva s greškom 422 osim ako oglas već ima sliku — pogledajte uploadAdImage/setAdImageUrl gore. | payments:write |
| GET | /v1/partner/payments/{id}Provjerite status uplate. | payments:read |
| POST | /v1/partner/referralsKreirajte partnersku poveznicu. | referrals:write |
| GET | /v1/partner/referrals/{code}/earningsKumulativni prihodi od preporuka, razvrstani po statusu. | referrals:read |
| GET | /v1/partner/ad-revenue/earningsVaših 70% udjela od onoga što su oglašivači koje ste kreirali u Connect modu platili za svoje oglase, razvrstano po statusu. | ad-revenue:read |
| GET | /v1/partner/access-logPotpuna historija poziva za ovaj ključ — metoda, putanja, IP, vremenski žig. | Tamo |
| GET | /v1/rankings?category={id}&geo={scope}Rangiranje samo za čitanje za kategoriju i geografski opseg. | Javno |
| GET | /v1/tiers7 konfiguriranih cjenovnih nivoa (prag, otključane pogodnosti). | Javno |
| GET | /v1/referral-programPostotci provizije koji su trenutno aktivni za kaskadu preporuka i bazen lidera. | Javno |
| GET | /v1/partner-programTrenutni omjer prihoda od oglasa (Connect mod) između vas i Annual Ads. | Javno |
| GET | /v1/search?q={query}Pretraga prirodnim jezikom — usmjerava upit poput "oglašivači namještaja u Keniji" na odgovarajuću kategoriju i geografski opseg, a zatim vraća taj poredak, u njegovom tačnom, stvarnom redoslijedu. | Javno |
Affiliate i referalno oglašavanje
advertiser_type, promotion_type, link_type i promoted_brand su opcionalna polja na POST i PATCH /v1/partner/ads — Annual Ads nije ograničeno na preduzeća koja oglašavaju sebe. Kada je link_type affiliate_link ili referral_invitation_link, ili promotion_type affiliate_offer ili referral_opportunity, affiliate_terms_accepted mora biti true, inače se zahtjev odbija kodom 422. naslov je ograničen na 35 znakova, a opis na 80 — oba ograničenja se provode na strani servera, a ne samo u korisničkom interfejsu nadzorne ploče.
Svaki oglašivački račun dobija skup ugrađenih AI alata — generator sadržaja i vizuala za oglase, konverzacijskog asistenta, savjetnika za budžet i vanjskog SEO revizora — koji se plaćaju AI kreditima, pored fiksne godišnje naknade.
| POST | /v1/advertisers/{id}/ai/assistantAsk Annual Ads — plutajući konverzacijski asistent, isključivo informativne prirode, samo za čitanje podataka o računu. | Javno |
| POST | /v1/advertisers/{id}/ai/creative-studioGenerirajte naslov oglasa, opis i ključne riječi na osnovu kratkog opisa poslovanja. | 2 kredit(a) |
| POST | /v1/advertisers/{id}/ai/creative-studio/imageGenerirajte vizualni prikaz oglasa (PNG) iz istog opisa poslovanja, hostiran i spreman za priloženje uz oglas. | 8 kredit(a) |
| POST | /v1/advertisers/{id}/ai/budget-advisorPrava statistička projekcija — nikada proizvoljna procjena — vjerovatnoće zadržavanja određenog ranga na 30/90/365 dana. | 1 kredit(a) |
| POST | /v1/advertisers/{id}/ai/seo-auditAnalizirajte vanjsku web stranicu oglašivača i predložite konkretna SEO poboljšanja. | 2 kredit(a) |
Ista kategorija i opis poslovanja također pokreću generator slika ispod.
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
}Generirajte odgovarajući vizual za istu reklamu:
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
}Postavite gotovu reklamnu jedinicu na svoju stranicu — bez faze izrade, bez iframea. Skripta se prikazuje direktno na stranici unutar izolovanog Shadow DOM-a, tako da se njeni stilovi nikada ne prenose na vašu stranicu, a stilovi vaše stranice se nikada ne prenose na nju.
<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>Po zadanom ovo prikazuje potpunu javnu rang-listu za kategoriju — svakog oglašivača na platformi, a ne samo one koje ste doveli. Da biste prikazali samo oglase oglašivača koje ste kreirali putem Connect moda (oni koji generišu vaš udio), dodajte data-partner sa ID-om vašeg partnera (pronađite ga na stranici za programere na svom kontrolnom panelu):
<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>Ako vaši oglašivači obuhvataju više kategorija, potpuno uklonite data-category — sa samo data-partnerom, widget prikazuje sve vaše oglase iz svih kategorija u jednoj mreži, umjesto da vam treba po jedan blok widgeta za svaku kategoriju:
<div
class="annualads-widget"
data-geo="global"
data-partner="YOUR_PARTNER_ID"
></div>
<script async src="https://adhub365.com/widget.js"></script>Želite li jedinicu u stilu podnožja pored one u sadržaju, pri čemu svaka prikazuje različite oglase? Dodajte drugi blok widgeta s atributom data-layout="compact" (jedan oglas, sklopiv u malu pilulu) i postavite data-offset na broj oglasa koje vaš prvi widget već prikazuje:
<!-- 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 | ID kategorije za prikaz. Obavezno — osim ako je postavljena opcija data-partner, u kojem slučaju izostavljanje prikazuje oglase tog partnera u svim kategorijama. |
data-geo | Geografski opseg: lokalni, regionalni ili globalni. Po zadanom je globalni. |
data-count | Broj oglasa za prikazivanje. Zadano 4. |
data-columns | Broj stupaca mreže. Zadano je 2. |
data-layout | mreža, lista ili kompaktno. Po zadanom je mreža. Kompaktno prikazuje jedan oglas (broj podataka se zanemaruje) s dugmetom za skupljanje u malu pilulu i vraćanje — jedinica u stilu podnožja, nikada fiksno pozicionirana od strane skripte; sami postavljate i stilizirate div kontejner kako želite na svojoj stranici. |
data-offset | Broj oglasa iz vrhunske ponude koje treba preskočiti. Po zadanom je 0. Omogućava drugom widgetu na istoj stranici (npr. kompaktnom u podnožju i mrežnom dalje gore) da prikazuje različite oglase umjesto da isti oglas ponovi dvaput — proslijedi broj oglasa koje drugi widget već prikazuje. |
data-partner | Vaš partner ID (pronađite ga na stranici za programere na svojoj kontrolnoj ploči). Opcionalno — bez njega, widget prikazuje potpunu javnu rang-listu za tu kategoriju, svakog oglašivača na platformi. S njim, samo oglase oglašivača koje ste doveli putem Connect načina — oni koji zapravo generišu vaš udio. |
Zahtjevi su ograničeni po ključu u minuti. Svaki autentificirani odgovor sadrži zaglavlja X-RateLimit-Limit, X-RateLimit-Remaining i X-RateLimit-Reset; prekoračenje limita vraća kod greške 429 Previše zahtjeva uz zaglavlje Retry-After.
Opcionalno, po partneru. Dok ne dodate unos, vaši ključevi prihvataju zahtjeve sa bilo koje IP adrese — prvi unos prebacuje sve ključeve tog partnera na režim isključivo dozvoljene liste.
Svaki webhook je potpisan HMAC-SHA256 metodom koristeći tajnu koja se izdaje samo jednom, pri kreiranju — provjerite potpis prije povjeravanja tereta. Događaji se dostavljaju samo partneru koji posjeduje odgovarajućeg oglašivača.
payment.succeeded | Uplata je potvrđena. |
payment.refunded | Povrat novca je izvršen. |
ad.activated | Oglas postaje aktivan, automatski ili nakon pregleda administratora. |
invoice.issued | Izdaje se faktura. |
referral.payout.completed | Referalna provizija dostiže status plaćanja. |
referral.payout.failed | Serija isplata provizija za preporuke ne uspije kod pružatelja usluga — zarada se vraća na stanje za isplatu i ponovo se pokušava. |
rank.changed | Rang oglasa se mijenja — uključujući i kada ga uzrokuje uplata drugog oglašivača. |
ad.expiring_soon | 30, 7 ili 1 dan prije isteka oglasa. |
partner_ad_revenue.payout.completed | Isplata udjela prihoda od oglasa dostiže status plaćanja. |
partner_ad_revenue.payout.failed | Serija isplate udjela prihoda od oglasa ne uspije kod pružatelja usluga — udjeli se vraćaju na stanje za isplatu i ponovo se pokušavaju. |
Zvanični JavaScript/TypeScript i Python SDK-ovi, generisani iz iste API specifikacije, su planirani, ali još nisu objavljeni — do tada direktno pozivajte HTTP API.
Još nema SDK-a — oni direktno pozivaju HTTP API i danas rade u bilo kojem jeziku.
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": "...",
},
)