Gradite izravno 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 načinu Connect plaćaju za svoje oglase — automatski uplać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/advertisersNastavite oglašivački račun u ime jednog od svojih korisnika (način povezivanja). | advertisers:write |
| GET | /v1/partner/advertisers/{id}Potražite oglašivački račun koji je stvorio ovaj partner. | advertisers:read |
| POST | /v1/partner/adsStvorite 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 u nastavku. | 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}/imageUčitajte sliku oglasa izravno (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 — poslužitelj je sam preuzima i hosta. Isti zahtjev: potrebno prije prve uplate. | ads:write |
| GET | /v1/partner/ads/{id}/rankTrenutni rang, kategorija i geografski doseg 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 kupnju 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/referralsStvorite 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 u onome što su oglašivači koje ste stvorili u načinu povezivanja platili za svoje oglase, razvrstanog po statusu. | ad-revenue:read |
| GET | /v1/partner/access-logPotpuna povijest poziva za ovaj ključ — metoda, putanja, IP adresa, vremenski žig. | Tamo |
| GET | /v1/rankings?category={id}&geo={scope}Rangiranje samo za čitanje za kategoriju i geografski opseg. | Javno |
| GET | /v1/tiers7 konfiguriranih razina cijena (prag, otključane pogodnosti). | Javno |
| GET | /v1/referral-programPostotci provizije trenutačno aktivni za kaskadu preporuka i bazen vođa. | Javno |
| GET | /v1/partner-programTrenutna podjela prihoda od oglasa (Connect način) 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 točnom stvarnom redoslijedu. | Javno |
Partnersko i preporučno oglašavanje
advertiser_type, promotion_type, link_type i promoted_brand su neobavezna polja u POST i PATCH /v1/partner/ads — Annual Ads nije ograničen na tvrtke koje same 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 odbacuje s kodom 422. naslov je ograničen na 35 znakova, a opis na 80 — oba ograničenja se provode na strani poslužitelja, a ne samo u korisničkom sučelju nadzorne ploče.
Svaki oglašivački račun dobiva skup ugrađenih AI alata — generator sadržaja i vizuala za oglase, konverzacijskog asistenta, savjetnika za proračun i vanjskog SEO revizora — koji se plaćaju AI kreditima, uz fiksnu godišnju cijenu.
| POST | /v1/advertisers/{id}/ai/assistantAsk Annual Ads — plutajući razgovorni 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 temelju kratkog opisa poslovanja. | 2 bodova |
| POST | /v1/advertisers/{id}/ai/creative-studio/imageGenerirajte vizualni prikaz oglasa (PNG) iz istog opisa tvrtke, hostiran i spreman za priloženje uz oglas. | 8 bodova |
| POST | /v1/advertisers/{id}/ai/budget-advisorPrava statistička projekcija — nikada generativna pretpostavka — vjerojatnosti zadržavanja određenog ranga na 30/90/365 dana. | 1 bodova |
| POST | /v1/advertisers/{id}/ai/seo-auditAnalizirajte vanjsku web stranicu oglašivača i predložite konkretna SEO poboljšanja. | 2 bodova |
Ista kategorija i opis poslovanja također pokreću generator slika u nastavku.
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 isti oglas:
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 web-stranicu — bez faze izrade, bez iframea. Skripta se izravno renderira na stranicu unutar izoliranog Shadow DOM-a, pa se njezini 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 prikazuje se potpuni javni poredak za kategoriju — svi oglašivači na platformi, a ne samo oni koje ste doveli. Da biste prikazali samo oglase oglašivača koje ste kreirali putem Connect moda (oni koji generiraju vaš udio), dodajte atribut data-partner s ID-om vašeg partnera (pronađite ga na stranici Developera na svojoj nadzornoj ploči):
<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 obuhvaćaju više kategorija, potpuno uklonite data-category — s 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 uz postojeću jedinicu u sadržaju još jednu u stilu podnožja, 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 izostavljanjem prikazuju se oglasi tog partnera u svim kategorijama. |
data-geo | Geografski opseg: lokalni, regionalni ili globalni. Zadano je globalni. |
data-count | Broj oglasa za prikaz. Zadano je 4. |
data-columns | Broj stupaca mreže. Zadano je 2. |
data-layout | mreža, popis ili kompaktno. Zadano je mreža. Kompaktno prikazuje jedan oglas (broj podataka se zanemaruje) s gumbom za skupljanje u malu pilulu i vraćanje — jedinica u stilu podnožja, nikada fiksno pozicionirana od strane skripte; samostalno postavljate i stilizirate div spremnika na svojoj stranici kako želite. |
data-offset | Broj oglasa s najvišim rangom koje treba preskočiti. Zadano je 0. Omogućuje drugom widgetu na istoj stranici (npr. kompaktnom u podnožju i mrežnom dalje gore) da prikazuje različite oglase umjesto da isti oglas ponavlja dvaput — proslijedi broj oglasa koje drugi widget već prikazuje. |
data-partner | Vaš ID partnera (pronađite ga na stranici Developera na svojoj nadzornoj ploči). Neobavezno — bez njega widget prikazuje potpunu javnu ljestvicu za tu kategoriju, odnosno sve oglašivače na platformi. S njim se prikazuju samo oglasi oglašivača koje ste doveli putem Connect načina — oni koji zapravo generiraju vaš udio. |
Zahtjevi su ograničeni po ključu u minuti. Svaki autentificirani odgovor nosi zaglavlja X-RateLimit-Limit, X-RateLimit-Remaining i X-RateLimit-Reset; prekoračenje ograničenja vraća kôd 429 Previše zahtjeva s zaglavljem Retry-After.
Opcionalno, po partneru. Dok ne dodate unos, vaši ključevi prihvaćaju zahtjeve s bilo koje IP adrese — prvi unos prebacuje sve ključeve tog partnera na režim isključivo dopuštenog popisa.
Svaki webhook je potpisan HMAC-SHA256 pomoću tajne koja se izdaje samo jednom pri stvaranju — provjerite potpis prije povjerenja u teret. Događaji se isporučuju 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 | Izdana je faktura. |
referral.payout.completed | Referentna provizija dosegne status plaćene. |
referral.payout.failed | Serija isplata provizija za preporuke ne uspije kod pružatelja usluga — zarada se vraća u stanje za isplatu i ponovno 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 dosegla je status plaćanja. |
partner_ad_revenue.payout.failed | Serija isplata udjela prihoda od oglasa ne uspije kod pružatelja usluga — udjeli se vraćaju u stanje za isplatu i ponovno se pokušavaju. |
Službeni JavaScript/TypeScript i Python SDK-ovi, generirani iz iste API specifikacije, planirani su, ali još nisu objavljeni — do tada izravno pozivajte HTTP API.
Još nema SDK-a — oni izravno 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": "...",
},
)