Dezvoltați direct pe platforma Annual Ads — creați conturi de agenți de publicitate, publicați anunțuri, inițiați plăți și monitorizați clasamentul, totul prin intermediul API-ului.
Consultați tabelul complet de prețuriPăstrezi 70% din suma pe care o plătesc agenții de publicitate din modul Connect pentru reclamele lor — sumă care este transferată automat în portofelul tău. Vezi mai jos cum funcționează.
Fiecare solicitare este autentificată cu o cheie secretă din antetul „Authorization”, utilizând schema „Bearer”.
POST https://api.adhub365.com/v1/partner/ads
Authorization: Bearer sk_sandbox_...
Content-Type: application/jsonCheile API sunt emise conturilor partenerilor aprobați de către echipa Annual Ads.
Creați un cont de partener| POST | /v1/partner/advertisersCreați un cont de advertiser în numele unuia dintre utilizatorii dumneavoastră (modul Connect). | advertisers:write |
| GET | /v1/partner/advertisers/{id}Căutați un cont de advertiser creat de acest partener. | advertisers:read |
| POST | /v1/partner/adsCreați un anunț. Acesta apare inițial în stare de schiță. Câmpurile opționale „advertiser_type”, „promotion_type”, „link_type” și „promoted_brand” descriu tipurile de publicitate: de afiliere, de recomandare, de creator sau individuală — consultați nota de mai jos. | ads:write |
| GET | /v1/partner/ads/{id}Caută un anunț. | ads:read |
| PATCH | /v1/partner/ads/{id}Actualizați conținutul editorial — titlu, descriere, link, tipul de advertiser, tipul promoției, tipul linkului și marca promovată. Categoria, zona geografică și orice alte informații luate în considerare de motorul de clasificare nu pot fi modificate niciodată aici. | ads:write |
| POST | /v1/partner/ads/{id}/imageÎncărcați direct o imagine pentru anunț (JPEG/PNG/WebP, maxim 5 MB). Este obligatoriu înainte de prima plată — consultați secțiunea „Plăți” de mai jos. | ads:write |
| POST | /v1/partner/ads/{id}/image-urlSetați imaginea unui anunț publicitar folosind o adresă URL, în loc să încărcați un fișier — serverul o preia și o găzduiește el însuși. Aceeași cerință: trebuie îndeplinită înainte de prima plată. | ads:write |
| GET | /v1/partner/ads/{id}/rankPoziția actuală, categoria și aria de acoperire geografică a unui anunț. | ads:read |
| GET | /v1/partner/ads/{id}/statsNumărul total de afișări și clicuri pentru un anunț — zilele scurse/rămase provin din câmpurile „activated_at” și „expires_at” existente deja în GET /{id}, iar poziția în clasament provine din GET /{id}/rank. | ads:read |
| POST | /v1/partner/paymentsInițiază o plată cu criptomonede pentru o achiziție inițială sau o reîncărcare. O plată inițială eșuează cu codul de eroare 422, cu excepția cazului în care anunțul conține deja o imagine — vezi uploadAdImage/setAdImageUrl mai sus. | payments:write |
| GET | /v1/partner/payments/{id}Verificați starea unei plăți. | payments:read |
| POST | /v1/partner/referralsCreează un link de recomandare. | referrals:write |
| GET | /v1/partner/referrals/{code}/earningsVeniturile cumulate din recomandări, defalcate în funcție de statut. | referrals:read |
| GET | /v1/partner/ad-revenue/earningsCota ta de 70% din suma plătită de agenții de publicitate pe care i-ai creat în modul „Connect” pentru anunțurile lor, defalcată în funcție de statut. | ad-revenue:read |
| GET | /v1/partner/access-logIstoric complet al apelurilor pentru această cheie — metodă, cale, adresă IP, marcaj temporal. | Acolo |
| GET | /v1/rankings?category={id}&geo={scope}Clasament numai pentru citire, pentru o categorie și o zonă geografică. | Public |
| GET | /v1/tiersCele 7 niveluri de preț configurate (prag, beneficii deblocate). | Public |
| GET | /v1/referral-programProcentajele de comision valabile în prezent pentru sistemul de recomandări în cascadă și pentru Leaders Pool. | Public |
| GET | /v1/partner-programRepartizarea actuală a veniturilor din publicitate (modul Connect) între tine și Annual Ads. | Public |
| GET | /v1/search?q={query}Căutarea în limbaj natural — direcționează o interogare precum „agenții de publicitate din domeniul mobilierului din Kenya” către categoria și aria geografică corespunzătoare, apoi afișează clasamentul respectiv, în ordinea exactă reală. | Public |
Publicitate prin programe de afiliere și recomandări
advertiser_type, promotion_type, link_type și promoted_brand sunt câmpuri opționale în cadrul cererilor POST și PATCH către /v1/partner/ads — Serviciul „Annual Ads” nu se limitează la companiile care își fac publicitate. Când link_type este affiliate_link sau referral_invitation_link, sau promotion_type este affiliate_offer sau referral_opportunity, affiliate_terms_accepted trebuie să fie true; în caz contrar, solicitarea este respinsă cu un cod de eroare 422. title are o limită maximă de 35 de caractere, iar description de 80 — ambele limite sunt impuse la nivel de server, nu doar în interfața de utilizare a tabloului de bord.
Fiecare cont de advertiser beneficiază de un set de instrumente AI integrate — un generator de conținut și elemente vizuale pentru reclame, un asistent conversațional, un consilier în materie de buget și un auditor SEO extern — plătite cu credite AI, pe lângă tariful anual fix.
| POST | /v1/advertisers/{id}/ai/assistantAsk Annual Ads — un asistent conversațional flotant, cu rol pur informativ, care oferă acces doar în citire la datele contului. | Public |
| POST | /v1/advertisers/{id}/ai/creative-studioGenerează un titlu, o descriere și cuvinte cheie pentru un anunț pe baza unei scurte descrieri a afacerii. | 2 credite |
| POST | /v1/advertisers/{id}/ai/creative-studio/imageGenerează o imagine de prezentare (PNG) pe baza aceleiași descrieri a companiei, găzduită online și gata de a fi atașată la un anunț. | 8 credite |
| POST | /v1/advertisers/{id}/ai/budget-advisorO proiecție statistică reală — niciodată o estimare aproximativă — a probabilității de a-și menține un anumit rang la 30, 90 și 365 de zile. | 1 credite |
| POST | /v1/advertisers/{id}/ai/seo-auditAnalizați site-ul web extern al agentului de publicitate și propuneți îmbunătățiri concrete în materie de SEO. | 2 credite |
Aceeași categorie și aceeași descriere a activității stau la baza generatorului de imagini de mai jos.
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
}Generați un element vizual corespunzător pentru același anunț:
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
}Plasează un bloc publicitar gata pregătit pe site-ul tău — fără etape de creare, fără iframe. Scriptul se afișează direct în pagină, într-un Shadow DOM izolat, astfel încât stilurile sale nu se transferă niciodată în site-ul tău, iar stilurile site-ului tău nu se transferă niciodată în acesta.
<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>În mod implicit, se afișează clasamentul public complet pentru categoria respectivă — toți agenții de publicitate de pe platformă, nu doar cei pe care i-ai adus tu. Pentru a afișa doar anunțurile agenților de publicitate pe care i-ai creat prin modul Connect (cei care îți generează comisionul), adaugă „data-partner” împreună cu ID-ul tău de partener (îl găsești pe pagina „Developers” din propriul tău panou de control):
<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>Dacă anunțatorii tăi acoperă mai multe categorii, renunță complet la „data-category” — folosind doar „data-partner”, widgetul afișează toate anunțurile tale din toate categoriile într-o singură grilă, în loc să fie nevoie de un bloc de widget pentru fiecare categorie:
<div
class="annualads-widget"
data-geo="global"
data-partner="YOUR_PARTNER_ID"
></div>
<script async src="https://adhub365.com/widget.js"></script>Vrei să ai un modul de tip „footer” alături de cel din conținut, fiecare afișând reclame diferite? Adaugă un al doilea bloc de widget cu atributul data-layout="compact" (o singură reclamă, care poate fi redusă la o „pilulă” mică) și setă atributul data-offset la numărul de reclame pe care le afișează deja primul tău widget:
<!-- 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-ul categoriei care urmează să fie afișată. Obligatoriu — cu excepția cazului în care este setat „data-partner”; în acest caz, omiterea acestuia va duce la afișarea anunțurilor acelui partener în toate categoriile. |
data-geo | Domeniul de aplicare geografic: local, regional sau global. Valoarea implicită este „global”. |
data-count | Numărul de anunțuri care vor fi afișate. Valoarea implicită este 4. |
data-columns | Numărul de coloane ale grilei. Valoarea implicită este 2. |
data-layout | grid, list sau compact. Implicit este setat la grid. Opțiunea compact afișează un singur anunț (valoarea atributului data-count este ignorată) împreună cu un buton care permite ascunderea acestuia într-o casetă mică și afișarea sa din nou — o unitate de tip subsol, care nu este niciodată poziționată fix de către script; poți plasa și stiliza elementul div container după cum dorești pe propria ta pagină. |
data-offset | Numărul de anunțuri din top care trebuie sărite. Valoarea implicită este 0. Permite unui al doilea widget de pe aceeași pagină (de exemplu, unul compact în subsol și unul sub formă de grilă mai sus) să afișeze anunțuri diferite, în loc să repete același anunț de două ori — introduceți numărul de anunțuri pe care celălalt widget le afișează deja. |
data-partner | ID-ul tău de partener (îl găsești pe pagina „Dezvoltatori” din propriul tău panou de control). Opțional — fără acesta, widgetul afișează clasamentul public complet pentru categoria respectivă, incluzând toți agenții de publicitate de pe platformă. Cu acesta, se afișează doar anunțurile agenților de publicitate pe care i-ai adus prin modul Connect — cei care îți generează efectiv cota de profit. |
Numărul de solicitări este limitat pe cheie, pe minut. Fiecare răspuns autentificat conține anteturile X-RateLimit-Limit, X-RateLimit-Remaining și X-RateLimit-Reset; depășirea limitei generează codul de eroare 429 Too Many Requests, împreună cu antetul Retry-After.
Opțional, pentru fiecare partener. Până când adaugi o intrare, cheile tale acceptă solicitări de la orice adresă IP — prima intrare comută toate cheile acelui partener în modul „numai lista de permisiuni”.
Fiecare webhook este semnat cu HMAC-SHA256 folosind un secret generat o singură dată, la momentul creării — verificați semnătura înainte de a considera încredibil conținutul. Evenimentele sunt transmise numai partenerului care deține advertiserul respectiv.
payment.succeeded | Plata a fost confirmată. |
payment.refunded | Se efectuează o rambursare. |
ad.activated | Un anunț devine activ, fie automat, fie după verificarea efectuată de administrator. |
invoice.issued | Se emite o factură. |
referral.payout.completed | Un comision de recomandare a atins statutul de „plătit”. |
referral.payout.failed | Un lot de plăți pentru recomandări eșuează la furnizor — sumele se întorc în contul de plăți și se încearcă din nou efectuarea plăților. |
rank.changed | Poziția unui anunț se modifică — inclusiv atunci când acest lucru este determinat de plata efectuată de un alt advertiser. |
ad.expiring_soon | Cu 30, 7 sau 1 zi (zile) înainte de expirarea unui anunț. |
partner_ad_revenue.payout.completed | O plată din cota de venituri din publicitate atinge statutul de „plătită”. |
partner_ad_revenue.payout.failed | O tranzacție de plată a cotei din veniturile publicitare eșuează la furnizor — sumele revin în contul de plăți și se încearcă din nou efectuarea plății. |
Sunt prevăzute SDK-uri oficiale pentru JavaScript/TypeScript și Python, generate pe baza aceleiași specificații API, dar acestea nu au fost încă publicate — până atunci, accesați direct API-ul HTTP.
Nu există încă un SDK — acestea accesează direct API-ul HTTP și funcționează deja în orice limbaj de programare.
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": "...",
},
)