Annual Ads

Documentació per a desenvolupadors

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 completa

Tu 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ó.

URL base

https://api.adhub365.com
OpenAPI 3

Autenticació

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/json

Sandbox i producció

Les claus sandbox i de producció estan totalment aïllades entre si — una clau sandbox mai podrà llegir ni escriure dades creades per una clau de producció, i viceversa.

Objectius

Cada clau està limitada als àmbits amb què es va emetre — una clau mai no té més accés que el compte de soci que la va crear.

Les claus d'API s'emeten als comptes de socis aprovats per l'equip d'Anuncis Anuals.

Crea un compte de soci

Repartiment dels ingressos publicitaris

Si les teves claus d'API creen comptes d'anunciants per als teus propis usuaris (mode Connect — vegeu Autenticació més amunt), obtens una part del que aquests anunciants paguen pels seus anuncis. La distribució que es mostra a continuació es llegeix en directe des d'aquest mateix punt final, mai no està codificada de manera estàtica i és totalment independent de la comissió de referència que es troba més avall en aquesta pàgina.

GET https://api.adhub365.com/v1/partner-program
{
  "partner_share_percentage": 0.7,
  "platform_share_percentage": 0.3
}

70%

Va per tu

Pagat automàticament al teu moneder de pagament configurat — no cal sol·licitar cap retirada.

30%

Ves a Anuncis anuals

Cobreix la moderació, l'allotjament i la infraestructura de classificació en què s'executen els teus anuncis.

Com funciona

  1. Un dels vostres anunciants en mode Connect paga un anunci a través de la vostra integració.
  2. L'anunci es revisa i s'aprova — automàticament o pel nostre equip de moderació.
  3. La teva part està a la cua per al pagament automàtic al teu moneder, el mateix mecanisme que el programa de referència següent.
Una participació mai no es crea fins que l'anunci no s'aprova realment — si la moderació el rebutja, no es deu res per aquest pagament. Un augment de fons en un anunci ja actiu no comporta cap risc d'aquest tipus i es reparteix immediatament.

Condicions de pagament

  • S'ha configurat una cartera de pagament de criptomonedes al vostre compte de soci.
  • No cal cap KYC per part teva — el teu compte de soci ja ha estat verificat en crear-se.

Exemple: llegir les accions acumulades

GET https://api.adhub365.com/v1/partner/ad-revenue/earnings
Authorization: Bearer sk_sandbox_...
{
  "shares": [
    {
      "id": "share_1a2b...",
      "payment_id": "pay_9f2a...",
      "ad_id": "ad_7c31...",
      "partner_amount_usd": 140.0,
      "platform_amount_usd": 60.0,
      "status": "paid",
      "payable_after": "2026-08-03T00:00:00Z",
      "paid_at": "2026-08-05T10:12:00Z"
    }
  ],
  "total_payable_pending_usd": 0.0,
  "total_payable_usd": 0.0,
  "total_processing_usd": 0.0,
  "total_paid_usd": 140.0
}

Punts finals

Comptes

POST/v1/partner/advertisers

Crea 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

Anuncis

POST/v1/partner/ads

Crea 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}/image

Pugeu 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-url

Estableix 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}/rank

Rang actual, categoria i abast geogràfic per a un anunci.

ads:read
GET/v1/partner/ads/{id}/stats

El 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

Pagaments

POST/v1/partner/payments

Inicia 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

Derivacions

POST/v1/partner/referrals

Crea un enllaç de referència.

referrals:write
GET/v1/partner/referrals/{code}/earnings

Guanys acumulats per derivacions, desglossats per estat.

referrals:read

Repartiment dels ingressos publicitaris

GET/v1/partner/ad-revenue/earnings

La 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

Fitxer de registre d'accés

GET/v1/partner/access-log

Historial complet de trucades per a aquesta clau — mètode, ruta, IP, segell de temps.

Allà

Punts finals públics

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/tiers

Els 7 nivells de preus configurats (llindar, avantatges desbloquejats).

Públic
GET/v1/referral-program

Els percentatges de comissió actualment actius per a la cascada de referència i el fons de líders.

Públic
GET/v1/partner-program

La 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.

Eines d'IA

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.

Aquests s'executen mitjançant l'inici de sessió al tauler de control de l'anunciant (un token d'accés de sessió), i no mitjançant una clau d'API de soci — una integració de tercers no els pot invocar en nom de l'anunciant.
POST/v1/advertisers/{id}/ai/assistant

Ask 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-studio

Genera 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/image

Genera 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-advisor

Una 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-audit

Analitza el lloc web extern de l'anunciant i suggereix millores SEO concretes.

2 crèdit(s)

Exemple — generar contingut d'anunci

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
}

Giny

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.

Afegeix-ho a la teva pàgina

<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>

Atributs

data-categoryID 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-countNombre d'anuncis a mostrar. Per defecte, 4.
data-columnsNombre de columnes de la graella. Per defecte, 2.
data-layoutgrid, 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-offsetNombre 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-partnerEl 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.

Repartiment d'ingressos

Com arriba realment a un soci la comissió de referència — el percentatge, el mecanisme de pagament i les precondicions.

GET https://api.adhub365.com/v1/referral-program
{
  "levels": [
    {
      "level": 1,
      "percentage": 0.1
    }
  ],
  "leaders_pool_percentage_of_gmv": 0.05,
  "founding_advertiser_pool_percentage_of_gmv": 0.05,
  "payout_verification_window_hours": 48,
  "min_payout_usd": 1
}

No és un nombre fix

El percentatge de comissió està configurat al nostre costat i pot canviar — sempre llegeix-lo en directe des d'aquest punt final en lloc d'establir un valor fix.

Totalment automàtic

No hi ha cap punt final de retirada. Una tasca programada genera guanys pagables, els agrupa per anunciant i els paga automàticament un cop es compleixen totes les condicions següents.

Condicions de pagament

  • Els guanys totals pagables de l'anunciant arriben a l'import mínim de pagament.
  • S'ha configurat una cartera de pagament de criptomonedes al seu compte.
  • El seu estat KYC està verificat.

Exemple: llegir els guanys acumulats

GET https://api.adhub365.com/v1/partner/referrals/{code}/earnings
Authorization: Bearer sk_sandbox_...
{
  "code": "ann-2f8c",
  "earnings": [
    {
      "id": "earn_1a2b...",
      "payment_id": "pay_9f2a...",
      "amount_usd": 30.0,
      "status": "paid",
      "payable_after": "2026-08-01T00:00:00Z",
      "paid_at": "2026-08-03T14:22:00Z"
    }
  ],
  "total_payable_pending_usd": 0.0,
  "total_payable_usd": 0.0,
  "total_processing_usd": 0.0,
  "total_paid_usd": 30.0
}

Nivells de preus (en directe)

Llegiu en directe des d'aquest punt final — no configureu mai aquests valors de manera estàtica, poden canviar del nostre costat. Crea un selector de nivell per als teus propis usuaris en lloc d'un camp de quantitat lliure: cada preu que es mostra ja és la quantitat exacta a enviar en crear el pagament, i els beneficis desbloquejats que es mostren aquí indiquen als usuaris exactament què els ofereix cada preu, de manera que poden triar un preu que entenguin en lloc d'endevinar una xifra.

NivellPreuDesbloqueja
Bronze$50.00

Basic visibility

Silver$300.00

Clickable link unlocked

Enllaç clicable
Gold$500.00

Animation unlocked

Enllaç clicableAnimació
Platinum$1,000.00

Enhanced exposure

Enllaç clicableAnimació
Diamond$2,500.00

Premium placement

Enllaç clicableAnimació
Elite$5,000.00

Top-tier visibility

Enllaç clicableAnimació
Legendary$10,000.00

Maximum visibility & branding

Enllaç clicableAnimació

Límits de velocitat

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.

Llista de permís d'IP

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.

Webhooks

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.succeededUn pagament està confirmat.
payment.refundedS'executa un reemborsament.
ad.activatedUn anunci es fa actiu, automàticament o després de la revisió de l'administrador.
invoice.issuedS'emet una factura.
referral.payout.completedUna comissió de referència arriba a l'estat de pagada.
referral.payout.failedUn 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.changedLa posició d'un anunci canvia, incloent-hi quan ho provoca el pagament d'un altre anunciant.
ad.expiring_soon30, 7 o 1 dia(s) abans que un anunci caduqui.
partner_ad_revenue.payout.completedUn pagament de participació en els ingressos publicitaris arriba a l'estat de pagat.
partner_ad_revenue.payout.failedUn 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.

Conjunts de desenvolupament de programari

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.

Inici ràpid

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": "...",
    },
)