Construïu directament a la plataforma Annual Ads: creeu anunciants, publiqueu anuncis, activeu pagaments i feu un seguiment del rànquing, tot a través de l'API.
Vegeu la taula de preus completaTu et quedes amb 70% del que paguen els anunciants del mode Connect per als seus anuncis — pagat automàticament a la teva cartera. Vegeu com funciona a continuació.
Cada sol·licitud s'autentica amb una clau secreta a l'encapçalament Authorization, utilitzant l'esquema Bearer.
POST https://api.adhub365.com/v1/partner/ads
Authorization: Bearer sk_sandbox_...
Content-Type: application/jsonLes claus d'API s'emeten als comptes de socis aprovats per l'equip d'Anuncis Anuals.
Crea un compte de soci| POST | /v1/partner/advertisersCrea un compte d'anunciant en nom d'un dels teus usuaris (mode Connect). | advertisers:write |
| GET | /v1/partner/advertisers/{id}Cerqueu un compte d'anunciant creat per aquest soci. | advertisers:read |
| POST | /v1/partner/adsCrea un anunci. Comença en estat d'esborrany. Els camps opcionals advertiser_type, promotion_type, link_type i promoted_brand descriuen publicitat d'afiliats, de referència, de creador o individual — vegeu la nota a continuació. | ads:write |
| GET | /v1/partner/ads/{id}Busca un anunci. | ads:read |
| PATCH | /v1/partner/ads/{id}Actualitza el contingut editorial — títol, descripció, enllaç, tipus d'anunciant, tipus de promoció, tipus d'enllaç i marca promocionada. La categoria, la geografia i qualsevol dada llegida pel motor de classificació mai no es poden canviar aquí. | ads:write |
| POST | /v1/partner/ads/{id}/imagePugeu una imatge d'anunci directament (JPEG/PNG/WebP, màxim 5 MB). És necessari abans del primer pagament — vegeu el grup de pagaments a continuació. | ads:write |
| POST | /v1/partner/ads/{id}/image-urlEstableix la imatge d'un anunci a partir d'una URL en lloc de pujar un fitxer — el servidor la recupera i la torna a allotjar ell mateix. El mateix requisit: cal fer-ho abans del primer pagament. | ads:write |
| GET | /v1/partner/ads/{id}/rankRang actual, categoria i abast geogràfic per a un anunci. | ads:read |
| GET | /v1/partner/ads/{id}/statsEl total de visualitzacions i clics d'un anunci — els dies transcorreguts/restants provenen dels camps activated_at/expires_at ja disponibles a GET /{id}, i el rànquing prové de GET /{id}/rank. | ads:read |
| POST | /v1/partner/paymentsInicia un pagament amb criptomoneda per a una compra inicial o per a una recàrrega. Un pagament inicial falla amb 422 tret que l'anunci ja tingui una imatge — vegeu uploadAdImage/setAdImageUrl més amunt. | payments:write |
| GET | /v1/partner/payments/{id}Comproveu l'estat d'un pagament. | payments:read |
| POST | /v1/partner/referralsCrea un enllaç de referència. | referrals:write |
| GET | /v1/partner/referrals/{code}/earningsGuanys acumulats per derivacions, desglossats per estat. | referrals:read |
| GET | /v1/partner/ad-revenue/earningsLa teva quota del 70 % del que els anunciants que vas crear en mode Connect han pagat pels seus anuncis, desglossada per estat. | ad-revenue:read |
| GET | /v1/partner/access-logHistorial complet de trucades per a aquesta clau — mètode, ruta, IP, segell de temps. | Allà |
| GET | /v1/rankings?category={id}&geo={scope}Rànquing només de lectura per a una categoria i un abast geogràfic. | Públic |
| GET | /v1/tiersEls 7 nivells de preus configurats (llindar, avantatges desbloquejats). | Públic |
| GET | /v1/referral-programEls percentatges de comissió actualment actius per a la cascada de referència i el fons de líders. | Públic |
| GET | /v1/partner-programLa distribució actual dels ingressos publicitaris (mode Connect) entre tu i Annual Ads. | Públic |
| GET | /v1/search?q={query}Cerca en llenguatge natural — redirigeix una consulta com "anunciants de mobles a Kenya" a la categoria i l'abast geogràfic corresponents, i després retorna aquesta classificació en el seu ordre real exacte. | Públic |
Publicitat d'afiliats i de referència
advertiser_type, promotion_type, link_type i promoted_brand són camps opcionals en les peticions POST i PATCH /v1/partner/ads — Annual Ads no es limita a empreses que s'anuncien a si mateixes. Quan link_type és affiliate_link o referral_invitation_link, o promotion_type és affiliate_offer o referral_opportunity, affiliate_terms_accepted ha de ser true o la petició es rebutja amb un 422. El títol té un límit de 35 caràcters i la descripció de 80 — ambdós límits s'apliquen des del servidor, no només a la interfície d'usuari del panell de control.
Cada compte d'anunciant disposa d'un conjunt d'eines d'IA integrades — un generador de contingut i imatges per a anuncis, un assistent conversacional, un assessor de pressupostos i un auditor SEO extern — pagades amb crèdits d'IA, a més del preu anual fix.
| POST | /v1/advertisers/{id}/ai/assistantAsk Annual Ads — un assistent de conversa flotant, només informatiu, en només lectura de les dades del compte. | Públic |
| POST | /v1/advertisers/{id}/ai/creative-studioGenera un títol d'anunci, una descripció i paraules clau a partir d'una breu descripció empresarial. | 2 crèdit(s) |
| POST | /v1/advertisers/{id}/ai/creative-studio/imageGenera una imatge de llistat (PNG) a partir de la mateixa descripció de negoci, allotjada i a punt per adjuntar a un anunci. | 8 crèdit(s) |
| POST | /v1/advertisers/{id}/ai/budget-advisorUna veritable projecció estadística — mai una suposició generativa — de les probabilitats de mantenir un determinat rànquing als 30/90/365 dies. | 1 crèdit(s) |
| POST | /v1/advertisers/{id}/ai/seo-auditAnalitza el lloc web extern de l'anunciant i suggereix millores SEO concretes. | 2 crèdit(s) |
La mateixa categoria i la descripció del negoci també alimenten el generador d'imatges següent.
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 una imatge visualitzadora per al mateix anunci:
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
}Arrossega una unitat publicitària ja preparada al teu propi lloc web — sense cap pas de configuració ni iframe. L'script renderitza directament a la pàgina dins d'un Shadow DOM aïllat, de manera que els seus estils mai no es filtren al teu lloc web, i els estils del teu lloc web mai no es filtren en ell.
<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>Per defecte, això mostra la classificació pública completa de la categoria — tots els anunciants de la plataforma, no només els que has incorporat. Per mostrar només els anuncis dels anunciants que has creat mitjançant el mode Connect (els que generen la teva quota), afegeix data-partner amb el teu ID de soci (troba'l a la pàgina de desenvolupadors del teu propi tauler 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>Si els teus anunciants abasten diverses categories, elimina completament data-category — només amb data-partner, el widget mostra tots els teus anuncis de totes les categories en una única graella, en lloc de necessitar un bloc de widget per categoria:
<div
class="annualads-widget"
data-geo="global"
data-partner="YOUR_PARTNER_ID"
></div>
<script async src="https://adhub365.com/widget.js"></script>Vols una unitat d'estil de peu de pàgina al costat de la que tens dins del contingut, cadascuna mostrant anuncis diferents? Afegeix un segon bloc de widgets amb data-layout="compact" (un sol anunci, plegable en una petita píndola) i data-offset establert al nombre d'anuncis que el teu primer widget ja mostra:
<!-- 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 de categoria per mostrar. Obligatori — tret que s'hagi establert data-partner, en aquest cas ometre-ho mostra els anuncis d'aquest soci en totes les categories. |
data-geo | Àmbit geogràfic: local, regional o global. Per defecte, global. |
data-count | Nombre d'anuncis a mostrar. Per defecte, 4. |
data-columns | Nombre de columnes de la graella. Per defecte, 2. |
data-layout | grid, list o compact. Per defecte, grid. compact mostra un sol anunci (es ignora data-count) amb un botó per col·lapsar-lo en una petita píndola i fer-lo tornar — una unitat d'estil peu de pàgina, mai posicionada fixa pel mateix script; tu col·loques i estils el contenidor div com vulguis a la teva pròpia pàgina. |
data-offset | Nombre d'anuncis de més alta classificació que s'han de saltar. Per defecte, 0. Permet que un segon giny a la mateixa pàgina (per exemple, un de compacte al peu de pàgina i un de quadrícula més amunt) mostri anuncis diferents en lloc de repetir el mateix anunci dues vegades — passa el nombre d'anuncis que l'altre giny ja mostra. |
data-partner | El teu ID de soci (troba'l a la pàgina de desenvolupadors del teu propi tauler de control). Opcional — sense ell, el widget mostra la classificació pública completa d'aquesta categoria, amb tots els anunciants de la plataforma. Amb ell, només els anuncis dels anunciants que has incorporat mitjançant el mode Connect — els que realment generen la teva quota. |
Les sol·licituds estan limitades per clau i per minut. Cada resposta autenticada inclou els encapçalaments X-RateLimit-Limit, X-RateLimit-Remaining i X-RateLimit-Reset; superar el límit retorna 429 Too Many Requests amb un encapçalament Retry-After.
Opcional, per a cada soci. Fins que no afegeixis una entrada, les teves claus accepten sol·licituds des de qualsevol IP — la primera entrada canvia totes les claus d'aquest soci perquè només admetin la llista blanca.
Cada webhook està signat amb HMAC-SHA256 mitjançant un secret emès un sol cop en el moment de la creació — verifiqueu la signatura abans de confiar en la càrrega útil. Els esdeveniments només es lliuren al soci que posseeix l'anunciant corresponent.
payment.succeeded | Un pagament està confirmat. |
payment.refunded | S'executa un reemborsament. |
ad.activated | Un anunci es fa actiu, automàticament o després de la revisió de l'administrador. |
invoice.issued | S'emet una factura. |
referral.payout.completed | Una comissió de referència arriba a l'estat de pagada. |
referral.payout.failed | Un lot de pagaments de referència falla al proveïdor — els guanys tornen a la secció de pagaments pendents i es tornen a processar. |
rank.changed | La posició d'un anunci canvia, incloent-hi quan ho provoca el pagament d'un altre anunciant. |
ad.expiring_soon | 30, 7 o 1 dia(s) abans que un anunci caduqui. |
partner_ad_revenue.payout.completed | Un pagament de participació en els ingressos publicitaris arriba a l'estat de pagat. |
partner_ad_revenue.payout.failed | Un lot de pagaments de repartiment d'ingressos publicitaris falla al proveïdor — les participacions tornen a la llista de pagaments pendents i es tornen a provar. |
Els SDK oficials de JavaScript/TypeScript i Python, generats a partir d'aquesta mateixa especificació de l'API, estan previstos però encara no s'han publicat — utilitzeu directament l'API HTTP fins aleshores.
Encara no hi ha cap SDK — aquests criden directament l'API HTTP i funcionen avui en qualsevol llenguatge.
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": "...",
},
)